【问题标题】:Find XElement by Attribute value按属性值查找 XElement
【发布时间】:2009-10-29 04:09:19
【问题描述】:

我有一组 IEnumerables,每个都有不同的属性值,对应于我的业务对象上的不同属性。这是我要查询的 XML 示例:

  <SimpleData name="zip">60004</SimpleData>
  <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData>
  <SimpleData name="state">IL</SimpleData>
  <SimpleData name="countyname">COOK</SimpleData>
  <SimpleData name="lat">42.1121336684356</SimpleData>
  <SimpleData name="lon">-87.9736682731814</SimpleData> 

我认为我的 linq2xml lambda 很接近(在搜索 MSDN 和 SO 之后),但我似乎无法正确调整它:

string cityName = simpleData.Where(a => a.Attribute("name").Value == "name").Select(a => a.Value).ToString();

cityName get 的值分配给“System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String]”而不是 ARLINGTON HEIGHTS

有什么建议吗?谢谢

【问题讨论】:

    标签: attributes linq-to-xml


    【解决方案1】:
    string cityName = (simpleData.Where(a => a.Attribute("name").Value == "name")
                      .Select(a => a.Value)).FirstOrDefault();
    

    (from x in simpleData
    where x.Attribute("name").Value == "name"
    select x.Value).FirstOrDefault()
    

    它返回一个IEnumerable&lt;string&gt;(Linq 扩展方法几乎总是返回集合而不是单个实例),其中包含name 属性等于name 的所有元素值。然后我们取第一个,或者null,如果它是空的。

    另外,XML 太可怕了,应该被枪杀。

    【讨论】:

    • 我建议使用(string)Attribute("name") 而不是Attribute("name").Value - 这是一回事,除了它首先进行空检查。由于Attribute() 在元素上不存在具有此类名称的属性时返回null,因此第一个此类元素将在当前编写的查询中触发NullReferenceException
    • 该死的,我知道这只是我缺少的一件小事,添加 FirstOrDefault 做到了。谢谢。我对 XML 无能为力,它是第 3 方数据导入源。
    • 1) 买一本关于 XML 的书。任何书。 2) 找到第 3 方。 3)用这本书把他们打得血淋淋。
    • 这不是可怕的 XML,只是有点烦人。 “可怕”是当您拥有像 &lt;order1&gt;...&lt;/order1&gt;&lt;order2&gt;...&lt;/order2&gt;... 这样的宝石时。或者&lt;name_of_entity_encoded_in_tag&gt;...&lt;/name_of_entity_encoded_in_tag&gt;怎么样?
    • Pav,删除你的评论。不要给任何人任何暗示这种邪恶甚至是可能的!
    【解决方案2】:

    如果你有 XML:

    <SimpleDataList>
       <SimpleData name="zip">60004</SimpleData>  
       <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData>  
       <SimpleData name="state">IL</SimpleData>  
       <SimpleData name="countyname">COOK</SimpleData>  
       <SimpleData name="lat">42.1121336684356</SimpleData>  
       <SimpleData name="lon">-87.9736682731814</SimpleData>
    </SimpleDataList>
    

    加载在XElement/XDocument SimpleDataList中,可以用XPath查询:

    SimpleDataList.XPathSelectElement(@"//SimpleDataList/SimpleData[@Name=""name""]");
    

    但我不确定您是从 XElement 开始还是简单的 IEnumerable... 无论如何...我想我会提到 XPath 以防它对您有所帮助。

    【讨论】:

    • 使用 XPath 查询XDocument 没有多大意义,因为它是专门为 LINQ 定制的。 XPath 也会稍微慢一些(因为它是一个必须首先解析的字符串)。
    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2012-06-14
    相关资源
    最近更新 更多