2016-05-21 2 views
0

Я просмотрел интернет, но я не могу найти решение для своей проблемы, хотя, я думаю, это должно быть очень просто.Добавить атрибут и строку в XML-файл в C#

У меня есть документ XML. Там два узла, которые выглядят как:

<Attachments> 
    </Attachments> 

<Templates> 
    </Templates> 

После добавления двух элементов к каждому узлу, они должны выглядеть так:

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

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

Я попытался следующий код для первого:

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); 
    } 

но это абсолютно ничего не значит. Как я могу достичь этих двух случаев?

Спасибо!

ответ

1

Я бы предложил использовать LINQ to XML, если у вас нет конкретной причины, по которой вы не можете. Старый XmlDocument API является довольно болезненным для работы с:

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); 

См this fiddle для рабочей демонстрации.

+0

Это замечательно! Большое спасибо! – Canox

+0

Один вопрос. Как поместить в него внутренний текст. Как в узле шаблона? – Canox

+1

@Canox Ваш лучший курс действий теперь - посмотреть на некоторые документы и руководства по LINQ to XML. Чтобы добавить текст в элемент, просто добавьте текст в параметры конструктора. Чтобы установить текст существующего элемента или атрибута, установите его свойство «Значение». –

0

Извините, я нашел ошибку. Цикл Еогеасп должен выглядеть следующим образом:

 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); 
     } 

, но я до сих пор не знаю, как достичь в случае с атрибутом шаблона в моем примере.

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