从c#中获取xml的属性名称

时间:2014-08-13 16:40:17

标签: c# xml

我得到一个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”的元素“子列表”的属性名称?

1 个答案:

答案 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}}。

但在我看来,代码的变化并不值得你所拥有的健壮性的损失。