当父节点等于 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#。
听起来你想要这样的东西:
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;