2010-08-23 4 views
6

Я создал файл XML так:как добавить/вставить условный узел в XML с помощью LINQ к XML

XElement employees = 
     new XElement("Work", 
      new XElement("record", 
       new XElement("Name", textBox1.Text), 
       new XElement("Phone", "206-555-0144"), 
       new XElement("Address", 
        new XElement("Street1", "123 Main St"), 
        new XElement("City", "Mercer Island"), 
        new XElement("State", "WA"), 
        new XElement("Postal", "68042") 
      )), 
      new XElement("record", 
       new XElement("Name", "22222"), 
       new XElement("Phone", "353245345"), 
       new XElement("Address", 
        new XElement("Street1", "sdfain St"), 
        new XElement("City", "asdf Island"), 
        new XElement("State", "QLD"), 
        new XElement("Postal", "54322") 
      )), 
       new XElement("record", 
       new XElement("Name", "Peter"), 
       new XElement("Phone", "1234"), 
       new XElement("Address", 
        new XElement("Street1", "sd St"), 
        new XElement("City", "cbr"), 
        new XElement("State", "act"), 
        new XElement("Postal", "2600") 
      ) 
     ) 
    ); 

Позже я хочу добавить новый дочерний узел под родительским узлом «запись» на основе состояния (где name = "peter"), что-то вроде этого:

empFile.Elements().Where(r => (string)r.Element("Name") == "Peter") 
        .Add(new XElement("record", 
          new XElement("Mobile", "3253425"), 
          new XElement("Work", 999999) 
         )); 

Как я могу это достичь?

+0

придираться: Вместо '(строка) r.Element ("Name")', я предположил бы, что с помощью 'r.Element ("Name") value' может быть лучшей формой.. – Timwi

+2

@ Тимви: Я бы не стал. Преимущество команды cast to string заключается в том, что она возвращает null вместо того, чтобы взорваться при удалении из нуля. Поэтому любой элемент без подэлемента под названием «Имя» просто игнорируется, а не вызывает провал программы. Я почти всегда предпочитаю использовать явные преобразования в LINQ to XML, если не найти элемент/атрибут, который должен считаться достаточно плохим, чтобы гарантировать исключение. –

+0

@ Jon Skeet: Справедливая точка. Я признаю, что я не думал о нулевом значении, но даже если бы это было так, не очевидно, что 'op_Explicit' принимает его и не бросает. Также не очевидно, что делает 'op_Explicit', если, например, элемент имеет подэлементы, тогда как документация для свойства Value больше явна (ха-ха, ирония). – Timwi

ответ

2

Вы почти там, где ваше положение возвращает IEnumerable<XElement> не один XElement, так что вам просто нужно исправить, т.е. называть Одиночная() или .Первый() и т.д.

например:

XElement xe = empFile.Elements().Where(r => (string)r.Element("Name") == "Peter").Single(); 

xe.Add(new XElement("record", new XElement("Mobile", "3253425"), new XElement("Work", 999999)); 
+0

u присвоили Empfile. Элементы(). blahblah для xe и xe.add новые элементы, но я нашел empFile также обновлен, как получилось? – Kiddo

3

Как и предложение Тима об использовании Where, а затем Single или First, стоит знать, что есть перегрузки тех методов, которые уже принимают предикаты. Например:

empFile.Elements() 
     .Single(r => (string) r.Element("Name") == "Peter") 
     .Add(...); 
Смежные вопросы