2016-09-26 23 views
0

我想添加子節點在現有的XML插入基於ID在C#中現有的XML的新的子節點

 <tblTemp> 
 
      <Details> 
 
      <LoginId>4</LoginId> 
 
      <AId>2</AId> 
 
      <OId>763</OId> 
 
      <LDate>2016-09-26</LDate> 
 
      <LTime>15:27:39</LTime> 
 
      <ReasonId>1</ReasonId> 
 
      <Flag>2</Flag> 
 
      </Details> 
 
      <Details> 
 
      <LoginId>3</LoginId> 
 
      <AId>2</AId> 
 
      <OId>763</OId> 
 
      <LDate>2016-09-26</LDate> 
 
      <LTime>12:22:39</LTime> 
 
      <ReasonId>4</ReasonId> 
 
      <Flag>2</Flag> 
 
      </Details> 
 
      <Details> 
 
      <LoginId>1</LoginId> 
 
      <AId>1</AId> 
 
      <OId>765</OId> 
 
      <LDate>2016-09-26</LDate> 
 
      <LTime>10:22:39</LTime> 
 
      <ReasonId>4</ReasonId> 
 
      <Flag>2</Flag> 
 
      </Details> 
 
     </tblTemp>

,我想這樣的

<tblTemp> 
 
     <Details> 
 
     <LoginId>4</LoginId> 
 
     <AId>2</AId> 
 
     <OId>763</OId> 
 
     <LDate>2016-09-26</LDate> 
 
     <LTime>15:27:39</LTime> 
 
     <FDate>2016-09-26</FDate> 
 
     <FTime>16:50:30</FTime> 
 
     <ReasonId>1</ReasonId> 
 
     <Flag>2</Flag> 
 
     </Details> 
 
     <Details> 
 
     <LoginId>3</LoginId> 
 
     <AId>2</AId> 
 
     <OId>763</OId> 
 
     <LDate>2016-09-26</LDate> 
 
     <LTime>12:22:39</LTime> 
 
     <FDate>2016-09-26</FDate> 
 
     <FTime>13:36:30</FTime> 
 
     <ReasonId>4</ReasonId> 
 
     <Flag>2</Flag> 
 
     </Details> 
 
     <Details> 
 
     <LoginId>1</LoginId> 
 
     <AId>1</AId> 
 
     <OId>765</OId> 
 
     <LDate>2016-09-26</LDate> 
 
     <LTime>10:22:39</LTime> 
 
     <FDate>2016-09-26</FDate> 
 
     <FTime>11:53:45</FTime> 
 
     <ReasonId>4</ReasonId> 
 
     <Flag>2</Flag> 
 
     </Details> 
 
    </tblTemp>
輸出

基於LoginId我想在xml文件中添加子節點。我一直在嘗試這樣的代碼。

//code for adding child node 
string strDBDir = "C:\\XMLfile.xml"; 
        try 
        { 
         DataSet dsxml = new DataSet(); 
         DataView DvXML = null; 
         dsxml.ReadXml(strDBDir); 
         DvXML = dsxml.Tables[0].DefaultView; 
         DvXML.RowFilter = "AId = '" + AId + "'"; 

         if (File.Exists(strDBDir)) 
         { 
          if (DvXML.ToTable().Rows.Count > 0) 
          { 
           LoginId = Convert.ToInt32(DvXML.ToTable().Rows[0]["LoginId"]); 

          XmlDocument originalXml = new XmlDocument(); 
          originalXml.Load(strDBDir); 
          XmlNode TechReport = originalXml.SelectSingleNode("Details"); 
          XmlNode Data = originalXml.CreateNode(XmlNodeType.Element, "FDate", null); 
          TechReport.AppendChild(Data); 
          originalXml.Save(strDBDir); 
         } 
        } 
        catch 
        { 
        } 

對於上面的代碼中,我得到一個exception-「對象引用不設置到對象的實例」 能否請您指導此,如何添加基於登錄ID在DBfile.xml的FDATE FTIME和而AId.I一直在爲此而苦苦掙扎。

+0

哪一行,你收到此錯誤? – A3006

回答

0

你可以通過改變你的搜索來實現。 取而代之的是尋找只爲「詳細信息」,它會隨機添加子元素,用「細節[登錄ID =‘4’]」

XmlNode TechReport = originalXml.SelectSingleNode("Details[LoginId='4']"); 

難道這就是你要找的?

另外,我想你會需要使用的createElement,而不是CreateNode

+0

我在Appendchild行得到異常...在添加LoginId ='4'後也有同樣的異常來... :( – tbs

+0

您嘗試過使用CreateElement? – A3006

0

使用XML LINQ和更改所有出現

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication16 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      foreach (XElement detail in doc.Descendants("Details")) 
      { 
       detail.Add(new object[] { 
        new XElement("LTime", DateTime.Now.ToString("hh:mm:ss")), 
        new XElement("FDate", DateTime.Now.Date.ToShortDateString()) 
       }); 
      } 

     } 
    } 
} 
0

我認爲

XmlNode TechReport = originalXml.SelectSingleNode("Details"); 

應該是:

XmlNode TechReport = originalXml.SelectSingleNode("tblTemp/Details"); 

或者更精確地說:

XmlDocument originalXml = new XmlDocument(); 
originalXml.Load(strDBDir); 
var TechReport = originalXml.SelectSingleNode($"tblTemp/Details[AId={AId}][LoginId={LoginId}]"); 
if (TechReport != null) 
{ 
    XmlNode Data = originalXml.CreateNode(XmlNodeType.Element, "FDate", null); 
    TechReport.AppendChild(Data); 
    originalXml.Save(strDBDir); 
} 
else 
{ 
    // Handle this as you see fit... 
} 
0

你可以用這種方式嘗試添加新的子:

XmlDocument xml = new XmlDocument(); 
xml.Load(strDBDir); 
XmlNodeList xnList = xml.SelectNodes("/tblTemp/Details"); 
foreach (XmlNode xn in xnList) 
{ 
    // here your **if** statement with check on loginId in **xn** 
    XElement child = new XElement("FDate"); 
    child.SetValue("2016-09-26"); 
    xn.AppendChild(child); 
} 
相關問題