如何使用 LINQ-to-XML 选择特定节点

51

我可以使用以下代码选择第一个客户节点并更改其公司名称。

但是,如何选择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..."));

答案:

谢谢各位,以下是准确的语法,用于查找客户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个回答

50

假设ID是唯一的:

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

根据不同情况,您也可以使用FirstFirstOrDefaultSingleOrDefaultWhere,而不是Single


1
为什么这会报错:System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>' 不包含名称为 'Single' 的定义,且未找到接受类型为 'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>' 的第一个参数的扩展方法 'Single'。 - Edward Tanguay
5
你的源代码开头有写 using System.Linq 吗? - Mehrdad Afshari

4

I'd use something like:

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

编辑:

错过了C#标签,抱歉......示例是用VB.NET编写的。


有没有可能将这个转换成C#? - Hexie
@Hexie 多语言能力总是一个巨大的优势。无论出于何种原因,VB程序员可以在C#中工作,但很少有反过来的情况。 - fcm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接