c# - Linq to XML 根据属性值选择节点

标签 c# linq linq-to-xml

我有一个 xml 文件,它返回一组由属性值唯一的元素。这会带来一个问题,因为我无法通过名称选择节点:

<doc>
    <float name="score">1.2873721</float>
    <arr name="2_category">
        <long>3021</long>
    </arr>
    <arr name="ATR_FamilyName">
        <str>Some Cookbook </str>
    </arr>
    <arr name="ATR_IsFamily">
        <str>0</str>
    </arr>
    <arr name="ATR_SellPrice">
        <str>49.95</str>
    </arr>
    <arr name="ATR_VendorId">
        <str>ABC</str>
    </arr>
    <arr name="ATR_VendorName">
        <str>WROX</str>
    </arr>      
</doc> 

我正在使用 linq 来填充“产品”类。我可以按位置选择元素,但是如果节点不存在,这就会成为一个问题。有没有办法根据节点的属性值来选择节点?在下面的示例中,如果 @name 属性 = "ATR_FamilyName",我可以获取 arr 节点吗?在 xpath 中它将是:

doc/arr[@name = 'ATR_FamilyName']/str

这是我的 linq to xml 查询:

var query = from rt in results
    where (String)rt.Descendants().ElementAt(5).Element("str").Value == "0"
    select new Product.Product
        {
            FamilyName = (String)rt.Descendants().ElementAt(3).Value
            // doc/arr[@name = 'ATR_FamilyName']/str - select Family Name is arr/@name 'ATR_FamilyName'                              
            MorePropertiestoset....                              
        };

最佳答案

类似于 AS-CII 的答案,但不使用查询表达式(外部表达式除外),并使用 XAttribute 的转换,并选择 str 元素值在匿名类型中:

select new Product.Product
{
    FamilyName = rt.Descendants("arr")
                   .Where(x => (string) x.Attribute("name") == "ATR_FamilyName")
                   .Select(x => (string) x.Element("str"))
                   .FirstOrDefault(),
    MorePropertiesToSet....                              
}; 

请注意,对 Attribute("name") 的调用结果使用强制转换意味着如果有任何元素没有属性,转换将导致空引用(不等于字符串文字)。如果您使用 Value 属性,您将得到一个异常。有时异常可能会更好 - 如果这表明数据已从根本上损坏并且您想了解它而不是仅仅不匹配该值。

(同样适用于将 XElement 转换为 string。)

关于c# - Linq to XML 根据属性值选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892488/

相关文章:

c# - LINQ to SQL - 选择以任何列表开头的位置

c# - 如何从 List<String[]> 创建一个 csv 文件

c# - 删除没有子节点的父节点

c# - jQgrid 搜索选项未按预期工作

c# - 是否使用 "Optional, DefaultParameterValue"属性?

c# - 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接

visual-studio-2010 - 在 powershell 中获取 app.config 元素

c# - 根据子节点对整个 xdocument 进行排序

C#:使用字符串变量调用其他内容并为其命名

C# .Net - 如何让应用程序等待,直到库中创建的所有线程完成