2014-02-04 2 views
3

Как добавить новый узел, где id является определенным значением из текстового поля? Это мой XML:Вставить новый узел xml для определенного id C#

<Students> 
    <Student> 
    <id>111</id> 
    <Value>1</Value> 
    <information> 
     <data DateTime="02.04.2014 13:00:00" Value="1"/> 
    </information> 
    </Student> 
</Students> 

Так что мой вопрос, у меня есть текстовое поле, где я вхожу студенческий билет. После нажатия кнопки я хочу добавить новый узел в информационный узел, содержащий дату и время атрибута в этот момент.

Другое дело, что я хочу, чтобы innerText в узле менялся от 1 до 0 и наоборот каждое новое время, которое я нажимаю. Таким образом, это будет второй атрибут в узле.

В следующий раз, когда я нажимаю, предполагается добавить новый узел, он добавит это.

 <information> 
     <data DateTime="02.04.2014 13:00:00" Value="1"/> 
     <data DateTime="02.04.2014 14:00:00" Value="0"/> 
    </information> 

Как я могу это сделать с помощью XmlLinq?

ответ

2
var xdoc = XDocument.Load(path_to_xml); 
var student = xdoc.Root.Elements("Student") 
        .FirstOrDefault(s => (int)s.Element("id") == id); 

if (student != null) // check if student was found 
{ 
    var info = student.Element("information"); 
    if (info == null) // check if it has information element 
    { 
     info = new XElement("information"); 
     student.Add(info); // create and add information element 
    } 

    var lastValue = info.Elements("data") 
         .OrderBy(d => (DateTime)d.Attribute("DateTime")) 
         .Select(d => (int)d.Attribute("Value")) 
         .LastOrDefault(); // get latest value 

    // create new data element 
    var data = 
     new XElement("data", 
     new XAttribute("DateTime", DateTime.Now.ToString("MM.dd.yyyy HH:mm:ss")), 
     new XAttribute("Value", lastValue == 0 ? 1 : 0)); 

    info.Add(data); // add data element to information element 
    xdoc.Save(path_to_xml); // save file 
} 

Результат:

<Students> 
    <Student> 
    <id>111</id> 
    <Value>1</Value> 
    <information> 
     <data DateTime="02.04.2014 13:00:00" Value="1" /> 
     <data DateTime="02.05.2014 00:40:18" Value="0" /> 
    </information> 
    </Student> 
</Students> 
+0

Как я могу добавить условие, если идентификатор не в xml, показать, например, окно сообщения? Я думаю, это будет в var student = xdoc.Root.Elements ("Student") .FirstOrDefault (s => (int) s.Element ("id") == id); – user2962759

+0

@ user2962759 добавить 'else' part:' if (student! = Null) {...} else {показать окно сообщения} ' –

1

C# есть метод, который позволит вам сделать это легко:

XmlNode.InsertAfter Метод

Ссылка на фактической странице: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertafter(v=vs.110).aspx

Примеры кода, если вы не хотите переходить по ссылке:

using System; 
using System.IO; 
using System.Xml; 

public class Sample { 

public static void Main() { 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" + 
      "<title>Pride And Prejudice</title>" + 
      "</book>"); 

XmlNode root = doc.DocumentElement; 

//Create a new node. 
XmlElement elem = doc.CreateElement("price"); 
elem.InnerText="19.95"; 

//Add the node to the document. 
root.InsertAfter(elem, root.FirstChild); 

Console.WriteLine("Display the modified XML..."); 
doc.Save(Console.Out); 

} }

Если вам нужно найти, специфический узел для вставки после, проверить это

http://msdn.microsoft.com/en-us/library/h0hw012b(v=vs.110).aspx

+0

есть разница между XMLnode и Xelement, а OP нужно решение xmlLinq + –

+0

Извините, вы разрабатываете? – Pseudonym

+0

Интересно, почему это было отменено .. разные xml, no linq. –

Смежные вопросы