Comment sélectionner un nœud spécifique avec LINQ-to-XML

Je peux sélectionner le premier nœud client et changer son nom d'entreprise avec le code ci-dessous.

Mais comment puis-je sélectionner le nœud client où 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..."));

Réponse:

Merci Les gars, pour l'enregistrement, voici la syntaxe exacte pour rechercher l'élément company dans l'élément customer-with-id-2, puis changer uniquement la valeur de l'élément company:

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

RÉPONDRE AVEC LA SYNTAXE DE LA MÉTHODE:

Juste compris dans la méthode syntaxe:

XElement elementToChange = (from c in xmldoc.Element("Customers")
                                .Elements("Customer")
                            where (int)c.Attribute("ID") == 3
                            select c).Single().Element("Company");
47
demandé sur Edward Tanguay 2009-02-27 13:31:24

2 réponses

En supposant que L'ID est unique:

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

Vous pouvez également utiliser First, FirstOrDefault, SingleOrDefault ou Where au lieu de Single pour des circonstances différentes.

45
répondu Mehrdad Afshari 2009-02-27 10:49:18

J'utiliserais quelque chose comme:

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

Modifier:

Raté la balise c#, désolé......l'exemple est dans VB.NET

4
répondu Nick 2009-02-27 10:44:33