2013-09-30 80 views
0

我是新来linq特别是LINQ到XML,我很难尝试遍历结果。我的xml文档具有嵌套在单个父节点中的多个相同名称的节点,并且使用了以下返回正确结果集的linq查询。LINQ to XML通过结果迭代

var listingAgentElements = from p in _xElement.Descendants("commercial") select p.Elements("listingAgent"); 

我的XML格式如下:

<commercial> 
    <listingAgent id="1"> 
    <listingAgent id="2"> 
    <listingAgent id="3"> 
</commercial>  

我得到一个包含所有上市代理人虽然由于某些原因的结果集,当我尝试做以下foreach循环在listingAgentElements每个元素我尝试遍历似乎有完全相同的结果设定为仍然有三个listingAgents:

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

每个listingAgent有一组孩子eleme的nts我想循环并获取值存储在数据库中,因为我正在做一个XML导入控制台应用程序。

看来他们可能是一个查询问题,但我真的不知道,有人可以请协助吗?

回答

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; 
     } 
    } 

其中的一个解决方案应该提供你带有你需要的listingAgents列表。如果您需要任何澄清发表评论,我会根据需要编辑答案。

顺便说一句,我想看看你的XML的格式 - 如果你已经复制/粘贴这一点,你必须关闭您的listingAgent标签,无论使用哪种<listingAgent id="1" /><listingAgent id="1"></listingAgent>。现在你已经提到你的listingAgent包含更多的标签,所以我假设你只是将代码剪下来只发布相关的部分,但只是你可能需要留意的东西。 (如果您使用Linq2XML来创建XML,则无论如何都会自动处理)。

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