1

我有以下xml:

<root ...>
  <Tables>
    <Table content="..">
    </Table>
    <Table content="interesting">
      <Item ...></Item>
      <Item ...></Item>
      <Item ...></Item>
    </Table>
    ...etc...
  </Tables>
</root>

我正在使用以下代码从“有趣”节点获取项目:

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;

有没有更简单、更清洁的方法来实现这一目标?

4

4 回答 4

5

好吧,使用查询表达式是没有意义的items,你可以很容易地将整个事情包装在一个语句中。我什至不会为此使用查询表达式:

var items = XElement.Parse(resp)
                    .Elements("Tables")
                    .Elements("Table")
                    .Where(n => n.Attribute("content").Value == "interesting")
                    .Elements();

请注意,这(以及您当前的查询)将为任何没有属性的Table元素引发异常。content如果你宁愿跳过它,你可以使用:

.Where(n => (string) n.Attribute("content") == "interesting")

反而。

于 2013-06-10T11:18:28.027 回答
2

您可以使用 XPath(扩展名在System.Xml.XPath命名空间中)在一行中选择所有项目:

var items = xel.XPathSelectElements("//Table[@content='interesting']/Item");
于 2013-06-10T11:23:06.607 回答
1

如果您不需要nodes查询之外的items,您可以这样做:

var items = from n in xel.Elements("Tables").Elements("Table")
            where n.Attribute("content").Value == "interesting"
            from i in n.Elements()
            select i;
于 2013-06-10T11:19:36.010 回答
1

使用 xml 文档
XmlDocument xdoc = new XmlDocument();

var item= xdoc.GetElementsByTagName("Table[@content='interesting']/Item");

于 2013-06-10T11:28:09.663 回答