这个问题的变化已经被问到了,但是我找不到一个可以帮助我解决问题的方法。
这种格式的给定和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;
结果是,我最终希望将其格式化为数据表。这可行吗?
答案 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']");