我有这样的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,但我如何查询它们?
由于
答案 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())
{
}