我是新手使用linq特别是linq到xml并且我在尝试迭代结果时遇到了麻烦。我的xml文档有多个同名的节点嵌套在单个父节点中,我使用了以下linq查询,它返回正确的结果集。
var listingAgentElements = from p in _xElement.Descendants("commercial") select p.Elements("listingAgent");
我的xml具有以下格式:
<commercial>
<listingAgent id="1">
<listingAgent id="2">
<listingAgent id="3">
</commercial>
我得到一个包含所有列表代理的结果集虽然由于某种原因,当我尝试对listingAgentElements执行以下foreach循环时,我尝试循环的每个元素似乎都具有完全相同的结果集仍然具有所有三个listingAgents:
foreach (var element in listingAgentElements)
{
var test = element;
}
每个listingAgent都有一组子元素,我想循环并获取存储在数据库中的值,因为我正在做一个xml导入控制台应用程序。
看起来他们的查询可能有问题,但我真的不确定,有人可以帮忙吗?
答案 0 :(得分:0)
好的,根据你发布的内容,看起来你的listingAgentElements
实际上包含2个枚举 - 一个来自_xElement.Descendants("commercial")
(即使只有一个,.Descendants
返回一个可枚举的列表),第二个来自.Elements("listingAgent")
我猜错了,并说你发布的XML,你的for
循环只运行一次?这意味着它循环遍历_xElement.Descendants
的可枚举,因此commercial
实际上是另一个包含所有3个listingAgent的可枚举。
如果你的XML只有一个“商业”标签,我会使用.Element("commercial")
得到它,或者如果它是你的XElement对象的根,那么就不用担心那个部分了。
所以选项是:
如果您只有一个“商业”代码,并且您的_xElement
实际上是一个代表此内容的XElement,请使用:
var listingAgentElements = from p in _xElement
select p.Elements("listingAgent");
如果你有一个“商业”标签,但它不是_xElement
的根,那么请使用:
var listingAgentElements = from p in _xElement.Element("commercial")
select p.Elements("listingAgent");
如果您只有一个“商业”代码,并且_xElement
实际上是XDocument
,请使用:
var listingAgentElements = from p in _xElement.Root
select p.Elements("listingAgent");
如果你有多个“商业”标签,请使用原始查询,但循环两次,例如:
foreach (var commercial in listingAgentElements)
{
foreach (var element in commercial)
{
var test = element;
}
}
其中一个解决方案应该为您提供所需的listingAgent列表。如果您在发表评论时需要任何澄清,我会根据需要编辑答案。
顺便说一下,我会查看XML的格式 - 如果您复制/粘贴了这个格式,则需要使用listingAgent
或{{{}来关闭<listingAgent id="1" />
代码1}}。现在你确实提到你的listingAgent包含更多标签,所以我假设你只是将代码剪下来只发布相关部分,但只是你可能需要关注的东西。 (如果您使用Linq2XML创建XML,无论如何都会自动处理)。
答案 1 :(得分:0)
使用SelectMany
将IEnumerable<IEnumerable<XElement>>
展平为IEnumerable<XElement>
:
var listingAgentElements = from p in _xElement.Descendants("commercial")
from l in p.Elements("listingAgent")
select l;
或者基于方法的语法:
var listingAgentElements = _xElement.Descendants("commercial")
.SelectMany(p => p.Elements("listingAgent");
迭代这种查询结果会为您提供所有<listingAgent>
元素。