【问题标题】:How to select a specific node with LINQ-to-XML如何使用 LINQ-to-XML 选择特定节点
【发布时间】:2009-02-27 10:31:24
【问题描述】:

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

但是如何选择 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 元素中搜索 company 元素的确切语法,然后只更改 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...")
    );

用方法语法回答:

刚刚在方法语法中也弄明白了:

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

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    假设 ID 是唯一的:

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

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

    【讨论】:

    • 为什么这会给我错误:System.Collections.Generic.IEnumerable' 不包含“Single”的定义,并且没有扩展方法“Single”接受找到“System.Collections.Generic.IEnumerable”类型的第一个参数
    • 你有using System.Linq 吗?
    【解决方案2】:

    我会使用类似的东西:

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

    编辑:

    错过了c#标签,对不起......示例是在VB.NET中

    【讨论】:

    • 有没有机会将其转换为 C#?
    • @Hexie 多语言总是一个很大的好处。无论出于何种原因,VB 人员都可以在 C# 中工作;但不是经常相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2012-05-11
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多