【问题标题】:How to select child nodes when parent node equals a specific value in LINQ to XML当父节点等于 LINQ to XML 中的特定值时如何选择子节点
【发布时间】:2012-05-11 00:46: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>

如何选择 UserAgent = "*" 的“项目”?

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

我在 ASP.net 中使用 C#。

【问题讨论】:

    标签: c# asp.net xml linq robots.txt


    【解决方案1】:

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

    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 模式吗?看起来你应该能够简化这个......)

    【讨论】:

      【解决方案2】:
      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多