c# XML基于属性获取节点
本文关键字:属性 获取 节点 XML 于属性 | 更新日期: 2023-09-27 18:17:36
我有以下xml:
<root ...>
<Tables>
<Table content="..">
</Table>
<Table content="interesting">
<Item ...></Item>
<Item ...></Item>
<Item ...></Item>
</Table>
...etc...
</Tables>
</root>
我使用以下代码从'interesting'节点获取项目:
XElement xel = XElement.Parse(resp);
var nodes = from n in xel.Elements("Tables").Elements("Table")
where n.Attribute("content").Value == "interesting"
select n;
var items = from i in nodes.Elements()
select i;
是否有更简单、更干净的方法来实现这一点?
对items
使用查询表达式是没有意义的,您可以很容易地将整个事情封装在单个语句中。我甚至不会为查询表达式而烦恼:
var items = XElement.Parse(resp)
.Elements("Tables")
.Elements("Table")
.Where(n => n.Attribute("content").Value == "interesting")
.Elements();
注意这个(和你当前的查询)将抛出一个异常,任何没有content
属性的Table
元素。如果你想跳过它,你可以使用:
.Where(n => (string) n.Attribute("content") == "interesting")
。
可以使用XPath(扩展在System.Xml中)。XPath命名空间)选择一行中的所有项:
var items = xel.XPathSelectElements("//Table[@content='interesting']/Item");
如果您在items
的查询之外不需要nodes
,您可以这样做:
var items = from n in xel.Elements("Tables").Elements("Table")
where n.Attribute("content").Value == "interesting"
from i in n.Elements()
select i;
使用XML文档
XmlDocument xdoc = new XmlDocument();
var item= xdoc.GetElementsByTagName("Table[@content='interesting']/item ");