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

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

我正在构建的应用程序的一部分需要从 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#。

最佳答案

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

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

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

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

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

(顺便说一句,你能改变 XML 模式吗?看起来你应该能够简化这个……)

关于c# - 当父节点等于 LINQ to XML 中的特定值时如何选择子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10398589/

相关文章:

c# - BigInteger.Parse() 无法读取大量数据

c# - XAML控件使用“可见性”类型而不是普通“ bool ”的实际原因是什么?

asp.net - 使用 ASP.NET 成员身份将 2FA 添加到 .NET Web 应用程序

php - 加载外部 xml 文件?

c# - 如何在不更改格式/间距的情况下在 C# 中编辑 XML?

c# - 从 Matlab 到 C# 的多元正态随机数

c# - 传递一个类/结构与传递多个参数

javascript - 如何在 DOM 加载之前开始加载 iframe

ASP.NET MVC : Click on a button to redirect based on drop down list's value

java - 在 Java 中使用 XAdES-EPES 对 XML 进行签名