用于在XML中选择属性的Lambda表达式

时间:2014-09-24 18:51:29

标签: c# xml linq lambda

我有这样的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,但我如何查询它们?

由于

2 个答案:

答案 0 :(得分:2)

因此,查询的这一部分返回子节点上可枚举的属性,与名称&#34; at1&#34;匹配。

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

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

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

答案 1 :(得分:1)

你不能Attributes("at1").ToString();返回一个表示当前对象的字符串,该字符串是IEnumerable<string> 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())
        {

        }