我得到一个XML - 这样的文件:
<list>
<sublist id1="a" id2="b" id3="b" id4="b">
<item name="name1">
<property1>a</property1>
</item>
<item2 name="name2">
<property1>c</property1>
</item2>
</sublist>
<sublist id1="b" id2="b" id3="a" id4="b">
[...more XML here...]
</sublist>
如何找到值为“a”的元素“子列表”的属性名称?
答案 0 :(得分:4)
如果您在名为xml
的变量中包含XML字符串:
XDocument
.Parse(xml) // parse the XML
.Descendants() // get all descendant elements
.SelectMany(e => e.Attributes()) // get all attributes from all elements
.Where(a => a.Value == "a") // leave only attributes whose value is "a"
.Select(a => a.Name); // select the name of those attributes
结果:
id1
id3
请注意,此代码使用XElement
和LINQ来完成目标。还有很多其他方式,其中一些可能更适合您的需求。
我现在注意到您只在sublist
元素上寻找属性。可以修改代码来处理:
XDocument
.Parse(xml) // parse the XML
.Descendants("sublist") // get all descendant elements named "sublist"
.SelectMany(e => e.Attributes()) // get all attributes from all elements
.Where(a => a.Value == "a") // leave only attributes whose value is "a"
.Select(a => a.Name); // select the name of those attributes
区别在于对Descendants
的调用,现在会过滤掉所有未调用的元素sublist
。
在评论中,您还询问了当只有一个sublist
元素时如何处理该案例。上面的代码片段也可以正常工作,因为他们并没有对元素的数量做出任何假设。
您可能会以不同的方式处理这种情况,例如使用以下代码:
XDocument
.Parse(xml) // parse the XML
.Descendants("sublist") // get all descendant elements named sublist
.Single() // get the one and only element
.Attributes() // get all attributes from all elements
.Where(a => a.Value == "a") // leave only attributes whose value is "a"
.Select(a => a.Name) // select the name of those attributes
这个和前面的例子之间的区别在于我们在这里使用Single
从结果中提取唯一的sublist
元素。此时代码中的项类型变为XElement
,如果没有(&#34;序列不包含元素&#34;)或多个(&#),Single
将抛出异常34;序列包含多个元素&#34;)sublist
元素。在下一行中,我们可以摆脱SelectMany
来电并立即访问Attributes
的{{1}}。
但在我看来,代码的变化并不值得你所拥有的健壮性的损失。