XML到Linq获取具有属性值的子节点

时间:2014-01-20 15:12:44

标签: c# xml linq datatable

这个问题的变化已经被问到了,但是我找不到一个可以帮助我解决问题的方法。

这种格式的给定和XML文件:

<TopLevel>
    <SecondLevel Name="Name" Color="Blue">
         <ChildNode1></ChildNode1>
         <ChildNode2></ChildNode2>
    </SecondLevel>
    <SecondLevel Name="Name2" Color="Red">
         ...
    </SecondLevel>
</topLevel>

我有属性Color的值。 我想要的是能够首先找到与该颜色对应的Name,然后找到所有的子节点。

我更喜欢在XDocument上使用Xelement。

这是我到目前为止所尝试的,但没有运气。

XElement xelement = XElement.Load("XmlFile.xml");
IEnumerable<XElement> Name2=
           from el in xelement.Elements("SecondLevel")
           where el.Attribute("Color") == "Red"
           select el;

结果是,我最终希望将其格式化为数据表。这可行吗?

1 个答案:

答案 0 :(得分:2)

你只是缺少对字符串的属性转换(或直接获取它的值 - 请参阅末尾的注释)。您也可以选择Name属性值来获得字符串序列而不是XElements:

XElement xelement = XElement.Load("XmlFile.xml");
IEnumerable<string> names =
           from el in xelement.Elements("SecondLevel")
           where (string)el.Attribute("Color") == "Red" // here
           select (string)el.Attribute("Name");

注意:您也可以使用el.Attribute("Color").Value直接访问属性值,但如果元素没有Color属性,则会抛出异常。因此,如果你希望你的代码在xml无效的情况下快速失败,那么转换是更安全的,但访问价值是可选的。

BTW你也可以使用XPath来获得具有所需颜色的二级元素:

IEnumerable<XElement> secondLevels = 
      xelement.XPathSelectElements("SecondLevel[@Color='Red']");