2013-09-30 81 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>元素。