【问题标题】:Lambda expression to select attribute in XML在 XML 中选择属性的 Lambda 表达式
【发布时间】:2014-09-24 18:51:29
【问题描述】:

我有一个这样的 XML -

<root>
   <child at1="1Dragon" at2="2">
      ...
   </child>
</root>

我想查询属性 at1 并检查它是否在字符串中有 1。为此,我编写了这个 lambda 表达式 -

XDocument xml = XDocument.Parse(my_xml);
bool test = xml.Descendants("child").Attributes("at1").ToString().Contains("1");

现在这并没有给我想要的结果。属性列表确实有 at1 和 at2 但我如何查询它们?

谢谢

【问题讨论】:

    标签: c# xml linq lambda


    【解决方案1】:

    所以这部分查询返回子节点上的可枚举属性,匹配名称“at1”。

    xml.Descendants("child").Attributes("at1")
    

    对此调用 ToString 会调用 IEnumerable 的默认 ToString 实现,这不是您想要的。您需要调用 LINQ 扩展方法来遍历属性并检查任何属性的值是否匹配。 Any 似乎很合适:

    bool test = xml.Descendants("child").Attributes("at1").Any(attribute => 
        attribute.Value.Contains("1"));
    

    【讨论】:

      【解决方案2】:

      你不能像Attributes("at1").ToString();那样返回一个代表当前对象的字符串,它是一个IEnumerable&lt;string&gt; litteraly返回

      如果你只有一个Child,你可以这样做

       bool testVallue = xml.Descendants("child").Attributes("at1").FirstOrDefault().Value.Contains("1");   
      

      如果你想要所有孩子的所有属性就这样做

      var  allVallue = xml.Descendants("child").Attributes("at1").Where(att => att.Value.Contains("1")); 
      //you can  then check 
              if (allVallue.Any())
              {
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        相关资源
        最近更新 更多