Обновить и добавить новый тег внутри XML

Ниже приведен пример моего XML:

<Customers>
  <Customer Id="1" Name="abc"/>
  <Customer Id="2" Name="efg"/>
</Customers>

Как обновить внутри этого XML с помощью XElement?

<Customer Id="1" Name="aaabbbccc"/>

И как добавить новую строку в этот xml??

<Customers>
  <Customer Id="1" Name="abc"/>
  <Customer Id="2" Name="efg"/>
  <Customer Id="3" Name="test"/>
</Customers>

И как получить указанное имя? Например, если 1, то abc, если 2, то efg.

Извините, но понятия не имею, новичок в XML и XElement.


person king jia    schedule 22.08.2013    source источник
comment
Начните здесь: msdn.microsoft.com/en-us/library /system.xml.xmldocument.aspx   -  person Max    schedule 22.08.2013


Ответы (3)


Я бы рекомендовал использовать LINQ to XML (в пространствах имен System.Linq и System.Xml.Linq);

// Load Xml
string xml = "";
XDocument doc = XDocument.Parse(xml);

// Get and modify element
if (doc.Root != null)
{
    var elementToModify = doc.Root.Elements("Customer").SingleOrDefault(x => x.Attribute("Id").Value == "2");
    if (elementToModify != null) elementToModify.SetAttributeValue("Name", "aaabbbccc");
}

// Add new Element
XElement customer = doc.Descendants("Customers").FirstOrDefault();
if (customer != null) customer.Add(new XElement("Customer", new XAttribute("Id", 3), new XAttribute("Name", "test")));

// OR (maddy's answer)
doc.Element("Customers").Add(new XElement("Customer", new XAttribute("Id", 3), new XAttribute("Name", "test")));

// OR (Richard's answer)
doc.Root.LastNode.AddAfterSelf(new XElement("Customer", new XAttribute("Id", 3), new XAttribute("Name", "test")));

РЕДАКТИРОВАТЬ:

// Get the Name attribute for a specified Id.
XElement element = doc.Root.Elements("Customer").Single(x => x.Attribute("Id").Value == "1");
string name = element.Attribute("Name").Value; // will be "abc"
person Sam Leach    schedule 22.08.2013
comment
Как насчет того, чтобы получить имя для указанного идентификатора? Например: если 1, то abc - person king jia; 22.08.2013
comment
Этот код получит все ваши элементы с атрибутом id, установленным на YOUR_ID. doc.Root.GetDescendants().Where(p => p.Attributes[id].Where(p => p.Value == YOUR_ID); - person Gusdor; 22.08.2013
comment
Смотрите мой обновленный ответ. ( @Gusdor, который возвращает IEnumerable‹XElement›, OP хочет атрибут имени) - person Sam Leach; 22.08.2013
comment
Я предполагаю, что модификация не будет работать таким образом, ее следует обновить, проверьте мой ответ ниже - person Ali Issa; 22.08.2013
comment
@Алиисса Почему? Такой же как у тебя? Вы имеете в виду проверку на ноль? - person Sam Leach; 22.08.2013
comment
@SamLeach нет, я имел в виду это: doc.Elements(Customers).Elements(Customer) - person Ali Issa; 22.08.2013
comment
@SamLeach добро пожаловать :), это работает как в моем, так и в вашем случае, так что голосую за вас - person Ali Issa; 22.08.2013

Проверьте эти ссылки, которые могут очень помочь (использование linq — один из лучших способов):

  1. добавить данные в существующий файл xml с помощью linq
  2. Добавление элемента в XML с помощью linq to XML
  3. Вставить новый узел XML с помощью LINQ

В качестве примера я только что сделал:

    string customers = "<Customers><Customer Id=\"1\" Name=\"abc\"/><Customer Id=\"2\" Name=\"efg\"/></Customers>";
    XDocument doc = XDocument.Parse(customers);
    XElement element = new XElement("Customer", new XAttribute("Id", "3"), new XAttribute("Name", "test"));
    doc.Element("Customers").Add(element);
    doc.Save(xmlfilepath);

Модифицировать:

    var myElement = doc.Elements("Customers").Elements("Customer").Where(el => el.Attribute("Id").Value == "2").SingleOrDefault();
    if (myElement != null)
        myElement.SetAttributeValue("Name", "aaabbbccc");
person Ali Issa    schedule 22.08.2013

Вы используете LINQ to XML, который, возможно, является самым простым из API-интерфейсов .NET XML:

Для первой части: обновления значения атрибута вам необходимо получить XAttribute для атрибута Name и измените его значение:

custElement.Attribute("Name").Value = "aaabbbccc";

предполагая, что CustElement является правильным элементом <Customer>.

Для второй части: добавьте еще один элемент, чтобы вставить элемент после другого, используйте ссылку AddAfterSelf метод XNode (родительский элемент XElement) , так что rootElement является XElement для элемента <Customers>:

rootElement.LastNode.AddAfterSelf(new XElement("Customer",
                                               new XAttribute("Id", 3),
                                               new XAttribute("Name", "test")));

(Первый параметр конструктора XElement — его имя, последующие — содержимое — либо атрибуты (как в данном случае), либо дочерние узлы. Есть несколько других способов сделать это: например, Add(object) для добавления к элементу XElement, обертывающему элемент <Customers>, но на практике обычно имеют собственные предпочтения и придерживаются их ( небольшая согласованность, делающая код немного проще).

Для третьей части: получить клиента по идентификатору, мы можем просто использовать выражение понимания LINQ:

var matches = (from cust in customersElement.Elements("Customer")
              where (int)cust.Attribute("Id") == theTargetId
              select cust)
              .Single();

(Это вызовет исключение, если будет найдено что-либо, кроме одного совпадения, используйте SingleOrDefault, чтобы вернуть null, если не найдено.)

person Richard    schedule 22.08.2013
comment
Как насчет того, чтобы получить имя для указанного идентификатора? Например: если 1, то abc - person king jia; 22.08.2013
comment
@kingjia Ой... слишком много вопросов в одном вопросе, так что пропустил. Будет расширяться. - person Richard; 22.08.2013