2016-09-26 5 views
0

Я хочу, чтобы добавить дочерний узел в существующий XMLвставить новый дочерний узел в существующий XML на основе идентификатора в C#

 <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- «ссылка на объект не указывает на экземпляр объекта» Можете ли вы вести на этом, как добавить FDate и FTIME в DBfile.xml, основанный на LoginID и AId.Я боролся за это.

+0

Какой линию вы получаете эту ошибку? – A3006

ответ

0

Этого можно достичь, изменив ваш поиск. Вместо ищет только «Детали», который добавит дочерние элементы случайным образом, использовать «Подробности [LoginID =„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); 
} 
Смежные вопросы