2016-05-21 4 views
0

Ich schaute im Internet, aber ich kann keine Lösung für mein Problem finden, obwohl ich denke, das sollte sehr einfach sein.Add Attribut und Zeichenfolge zu XML-Datei in C#

Ich habe ein XML-Dokument. Es zwei Knoten, die wie folgt aussehen:

<Attachments> 
    </Attachments> 

<Templates> 
    </Templates> 

Nach der Zugabe von zwei Elementen zu jedem Knoten, sollten sie wie folgt aussehen:

<Attachments> 
     <Attachment INDEX0="Test1" /> 
     <Attachment INDEX1="Test2" /> 
     </Attachments> 

    <Templates> 
     <Template INDEX0="Test1">EMPTY</Template> 
     <Template INDEX0="Test2">EMPTY</Template> 
     </Templates> 

ich für die erste folgende Code versucht:

XmlDocument doc = new XmlDocument(); 
     doc.Load(Path.Combine(Directory.GetCurrentDirectory(), "test.xml")); 
     XmlElement root = doc.DocumentElement; 
     XmlNode node = root.SelectSingleNode("//Attachments"); 

    List<String> list = new List<string>() {"Test1","Test2"}; 

    foreach(var item in list) 
    { 
     XmlElement elem = doc.CreateElement("Attachment"); 
     root.AppendChild(elem); 
     XmlNode subNode = root.SelectSingleNode("Attachment"); 
     XmlAttribute xKey = doc.CreateAttribute(string.Format("INDEX{0}", list.IndexOf(item).ToString())); 
     xKey.Value = item; 
     subNode.Attributes.Append(xKey); 
    } 

aber das tut absolut nichts. Wie kann ich diese beiden Fälle erreichen?

Vielen Dank!

Antwort

1

Ich würde vorschlagen, LINQ zu XML zu verwenden, außer Sie haben einen bestimmten Grund, den Sie nicht können. Der alte XmlDocument API ist sehr schmerzhaft, mit zu arbeiten:

var items = new List<string> {"Test1", "Test2"}; 

var attachments = items.Select((value, index) => 
    new XElement("Attachment", new XAttribute("INDEX" + index, value))); 

var doc = XDocument.Load(@"path/to/file.xml"); 

doc.Descendants("Attachments") 
    .Single() 
    .Add(attachments); 

Siehe this fiddle für eine funktionierende Demo.

+0

Das ist großartig! Vielen Dank! – Canox

+0

Eine Frage. Wie lege ich einen inneren Text hinein? Wie im Vorlagenknoten? – Canox

+1

@Canox Ihre beste Vorgehensweise ist jetzt, einige Dokumentationen und Tutorials rund um LINQ to XML zu sehen. Um Text zu einem Element hinzuzufügen, fügen Sie einfach einen Text in die Konstruktorparameter ein. Um den Text eines vorhandenen Elements oder Attributs festzulegen, legen Sie die Eigenschaft Value fest. –

0

Entschuldigung, ich habe den Fehler gefunden. Die foreach-Schleife soll wie folgt aussehen:

 foreach(var item in list) 
     { 
      XmlElement elem = doc.CreateElement(string.Format("Attachment{0}", list.IndexOf(item))); 
      node.AppendChild(elem); 
      XmlNode subNode = root.SelectSingleNode(string.Format("//Attachment{0}", list.IndexOf(item))); 
      XmlAttribute xKey = doc.CreateAttribute(string.Format("INDEX{0}", list.IndexOf(item).ToString())); 
      xKey.Value = item; 
      subNode.Attributes.Append(xKey); 
     } 

aber ich weiß noch nicht, wie der Fall mit dem Template-Attribute in meinem Beispiel zu erreichen.