Как выбрать конкретный узел с LINQ-to-XML - PullRequest
48 голосов
/ 27 февраля 2009

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

Но как выбрать клиентский узел, где ID = 2?

    XDocument xmldoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XComment("These are all the customers transfered from the database."),
        new XElement("Customers",
            new XElement("Customer",
                new XAttribute("ID", 1),
                new XElement("FullName", "Jim Tester"),
                new XElement("Title", "Developer"),
                new XElement("Company", "Apple Inc.")
                ),
            new XElement("Customer",
                new XAttribute("ID", 2),
                new XElement("FullName", "John Testly"),
                new XElement("Title", "Tester"),
                new XElement("Company", "Google")
                )
            )
        );

    XElement elementToChange = xmldoc.Element("Customers").Element("Customer").Element("Company");
    elementToChange.ReplaceWith(new XElement("Company", "new company value..."));

ОТВЕТ:

Спасибо, ребята, за запись, вот точный синтаксис для поиска элемента компании в элементе customer-with-id-2, а затем изменения только значения элемента компании:

XElement elementToChange = xmldoc.Element("Customers")
    .Elements("Customer")
    .Single(x => (int)x.Attribute("ID") == 2)
    .Element("Company");
elementToChange.ReplaceWith(
    new XElement("Company", "new company value...")
    );

ОТВЕТ С СИНТАКСОМ МЕТОДА:

Только что понял это и в синтаксисе метода:

XElement elementToChange = (from c in xmldoc.Element("Customers")
                                .Elements("Customer")
                            where (int)c.Attribute("ID") == 3
                            select c).Single().Element("Company");

Ответы [ 2 ]

46 голосов
/ 27 февраля 2009

Предполагая, что идентификатор уникален:

var result = xmldoc.Element("Customers")
                   .Elements("Customer")
                   .Single(x => (int?)x.Attribute("ID") == 2);

Вы также можете использовать First, FirstOrDefault, SingleOrDefault или Where вместо Single для различных обстоятельств.

4 голосов
/ 27 февраля 2009

Я бы использовал что-то вроде:

dim customer = (from c in xmldoc...<Customer> 
                where c.<ID>.Value=22 
                select c).SingleOrDefault 

Edit:

пропустил тег c #, извините ...... пример в VB.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...