0

我是使用 linq 尤其是 linq to 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 循环时,我尝试循环的每个元素似乎具有与仍然具有所有三个列表代理的结果集完全相同的结果集:

foreach (var element in listingAgentElements)
{
    var test = element;
}

每个listingAgent 都有一组子元素,我想在其中循环并获取要存储在数据库中的值,因为我正在执行xml 导入控制台应用程序。

看来他们的查询可能有问题,但我真的不确定,有人可以帮忙吗?

4

2 回答 2

1

用于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>元素。

于 2013-09-30T10:04:17.670 回答
0

好的,从您发布的内容来看,您listingAgentElements实际上包含 2 个可枚举项 - 一个来自_xElement.Descendants("commercial")(即使只有一个,.Descendants返回一个可枚举列表),第二个来自.Elements("listingAgent")

我冒险猜测并说从您发布的 XML 中,您的for循环只运行一次?这意味着它循环遍历可枚举的 for _xElement.Descendants,因此commercial实际上是另一个包含所有 3 个列表代理的可枚举。

如果您的 XML 只有一个“商业”标签,我会使用.Element("commercial").

所以选项是:如果你只有一个“商业”标签,而你_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 包含更多标签,所以我假设您只是将代码缩减为仅发布相关部分,但只是您可能需要关注的一些内容。(如果您使用 Linq2XML 创建 XML,无论如何都会自动处理)。<listingAgent id="1" /><listingAgent id="1"></listingAgent>

于 2013-09-30T09:25:23.543 回答