2015-07-28 63 views
4

我想XElements兩個清單合併爲一個:如何將兩個XElements與linq select結合使用?

var list1 = XElement.Parse(@"<root><Element name=""foo""> 
             <ChildElement name=""childFoo""> 
              <SubChildElement name=""subChildFoo"" /> 
             </ChildElement> 
            </Element> 
            <Element name=""bar""> 
             <ChildElement name=""childBar""> 
              <SubChildElement name=""subChildBar"" /> 
             </ChildElement> 
            </Element> 
            <Element name=""zoo"" /></root>").XPathSelectElements("Element").ToList(); 

var list2 = XElement.Parse(@"<root><Element name=""foo"" attr=""fooAtr"" /> 
            <Element name=""bar"" attr=""barAtr"" /> 
            <Element name=""zoo"" attr=""barAtr"" /></root>").XPathSelectElements("Element").ToList(); 

var res = from e2 in list2 
      join e1 in list1 
      on e2.Attribute("name").Value equals e1.Attribute("name").Value 
      select new XElement(e1.Add(e2.Element("ChildElement"))); 

代碼將無法編譯,因爲選擇是錯誤的(XElement.Add()返回void)。

我怎樣才能將二者結合起來XElements:E1和E2內選擇和(與E1的子元素E2)

我想獲得這種格式列表中返回新的XElement:

<Element name="foo" attr="fooAtr"> 
    <ChildElement name="childFoo"> 
     <SubChildElement name="subChildFoo" /> 
    </ChildEelement> 
</Element> 
<Element name="bar" attr="barAtr"> 
    <ChildElement name="childBar"> 
     <SubChildElement name="subChildBar" /> 
    </ChildEelement> 
</Element> 
<Element name="zoo" attr="barAtr" /> 

回答

5

我會拋棄XPath並使用LINQ to XML查詢方法來查找元素。你select需要複製該名稱,並從第二個元素屬性,並從第一子元素:

var results = from e2 in second.Descendants("Element") 
       join e1 in first.Descendants("Element") 
        on (string)e2.Attribute("name") equals (string)e1.Attribute("name") 
       select new XElement(e2.Name, e2.Attributes(), e1.Elements()); 

看到一個工作演示在這裏:https://dotnetfiddle.net/J3mcXu

+1

這正是我所期待的,很好用,因爲我可以將來自e1和e2的屬性分組,並仍然使用構造函數。 – greenfeet

1

爲什麼你會得到一個錯誤的原因是,一個Select()操作必須返回一個對象。你基本上試圖在Select()操作中執行一個foreach,而這不是它的用法。 LINQ不包含foreach op,因爲它可能有副作用,所以應該使用另一種方法。

編輯:我最初發布將連接列表,而不是合併它們。我打算髮布另一個答案,但@Charles Mager發佈了最簡單的解決方案,您正在嘗試做什麼。我在這裏留下這個答案,雖然解釋爲什麼您嘗試選擇語句不能正常工作。

+0

這只是將所有元素連接在一起 - 所需要的是問題中顯示的合併輸出。 –

+0

你絕對正確,我會編輯。 – JNYRanger

+0

@JNYRanger謝謝! – greenfeet