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;

是否有更简单、更干净的方法来实现这一点?

c# XML基于属性获取节点

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 ");