当父节点等于 LINQ to XML 中的特定值时,如何选择子节点

本文关键字:何选择 子节点 选择 LINQ 父节点 to XML | 更新日期: 2023-09-27 18:32:52

我正在构建的应用程序的一部分需要从XML文档生成robots.txt文件。

我有这样的XML:

<root>
  <Robots>
    <UserAgents>
      <UserAgent>*</UserAgent>
      <Disallow>
        <Item>/wibble/</Item>
        <Item>/wobble/</Item>
      </Disallow>
    </UserAgents>
    <UserAgents>
      <UserAgent>Google</UserAgent>
      <Disallow>
        <Item>/</Item>
      </Disallow>
    </UserAgents>
  </Robots>
</root>

如何选择用户代理 ="*"的"项目"?

换句话说,我只想在父节点等于某个值时才选择子节点。 父节点中的值将是唯一的。

我在 ASP.net 中使用 C#。

当父节点等于 LINQ to XML 中的特定值时,如何选择子节点

听起来你想要这样的东西:

var query = from agent in doc.Descendants("UserAgent")
            where (string) agent == "*"
            from item in agent.Parent.Elements("Disallow").Elements("Item") 
            select item;

请注意,第二个from仅用于平展结果,因此它不是序列序列。

或者:

var query = doc.Descendants("UserAgent")
               .Where(agent => (string) agent == "*")
               .SelectMany(agent => agent.Parent.Elements("Disallow")
                                                .Elements("Item"));

或者通过将选择的"top"节点更改为UserAgents,您可以避免父步骤:

var query = doc.Descendants("UserAgents")
               .Where(agents => (string) agents.Element("UserAgent") == "*")
               .SelectMany(agent => agent.Elements("Disallow").Elements("Item"));

请注意,如果在单个UserAgents元素下有多个UserAgent元素,则不会给出相同的结果。

(顺便说一句,你能改变XML架构吗?看起来你应该能够简化这个...

var query = from x in doc.Root.Element("Robots").Elements("UserAgents")
            where (string)x.Element("UserAgent") == "*"
            from y in x.Element("Disallow").Elements("Item")
            select y;