2014-10-27 150 views
0

您好我有以下問題:LINQ排序查詢XML的

我試圖做一個XML文件中的以下內容:所有排序根據字符串的ID屬性結構。但是返回一個CONTENT對象列表。 XML可以包含多個元素。

<OBJECT> 
    <CONTENT> 
    <STRUCT> 
     <STRING ID="2">string</STRING> 
    </STRUCT> 
    <STRUCT> 
     <STRING ID="1">string1</STRING> 
    </STRUCT> 
    </CONTENT> 
</OBJECT> 
<OBJECT> 
    <CONTENT> 
    <STRUCT> 
     <STRING ID="345">string</STRING> 
    </STRUCT> 
    <STRUCT> 
     <STRING ID="333">string</STRING> 
    </STRUCT> 
    </CONTENT> 
</OBJECT> 

我使用下面的LINQ查詢,但該字符串不進行排序:

Dim Contents = From nm In origXML.Descendants("CONTENT") 
    Let ID = nm.Element("STRUCT").Element("STRING").Attribute("ID") 
    Order By ID Ascending 
    Select nm 

For Each xmlString In Contents.... 

所需的輸出

<OBJECT> 
    <CONTENT> 
    <STRUCT> 
     <STRING ID="1">string</STRING> 
    </STRUCT> 
    <STRUCT> 
     <STRING ID="2">string1</STRING> 
    </STRUCT> 
    </CONTENT> 
</OBJECT> 
<OBJECT> 
    <CONTENT> 
    <STRUCT> 
     <STRING ID="333">string</STRING> 
    </STRUCT> 
    <STRUCT> 
     <STRING ID="345">string</STRING> 
    </STRUCT> 
    </CONTENT> 
</OBJECT> 

我知道一定有其他方法可以做到這一點,但我想知道是否可以使用LINQ?

感謝

羅布

回答

0

我不認爲一個單一的LINQ查詢可以給你所需的輸出。爲了正確地創建一個與原始結構相同的新XML文檔,需要將多個嵌套LINQ查詢應用於原始XML文檔。

假設你的XML的根節點<OBJECTS>,下面這段代碼應該給你所需要的輸出:

Dim xElement As XElement = New XElement("OBJECTS", 
           From obj In origXML.Descendants("OBJECT") 
           Select New XElement("OBJECT", 
           From content In obj.Descendants("CONTENT") 
           Select New XElement("CONTENT", 
            From st In content.Descendants("STRUCT") 
            Let ID = Convert.ToInt32(st.Element("STRING") 
                .Attribute("ID").Value) 
            Order By ID Ascending 
            Select New XElement("STRUCT", 
             New XElement("STRING", st.Element("STRING").Value, 
              New XAttribute("ID", ID))) 
            ) 
           ) 
          ) 
0

如果您<OBJECT><CONTENT>層次結構是靜態的(沒有屬性,等等,這需要被複制到輸出),那麼你可以在一個LINQ查詢中做到這一點,使用VB.NET的XML literals的漂亮支持與嵌入式查詢。

Dim origXML = 
<OBJECTS> 
    <OBJECT> 
     <CONTENT> 
      <STRUCT> 
       <STRING ID="2">string2</STRING> 
      </STRUCT> 
      <STRUCT> 
       <STRING ID="1">string1</STRING> 
      </STRUCT> 
     </CONTENT> 
    </OBJECT> 
    <OBJECT> 
     <CONTENT> 
      <STRUCT> 
       <STRING ID="345">string345</STRING> 
      </STRUCT> 
      <STRUCT> 
       <STRING ID="333">string333</STRING> 
      </STRUCT> 
     </CONTENT> 
    </OBJECT> 
</OBJECTS> 
Dim out = New XDocument(New XElement("OBJECTS", 
    From c In origXML...<CONTENT> 
    Select _ 
    <OBJECT> 
     <CONTENT> 
      <%= From s In c.<STRUCT> Order By CInt(s.<STRING>[email protected]) Select s %> 
     </CONTENT> 
    </OBJECT> 
)) 

out變量將是包含以下內容的一個XDocument:

<OBJECTS> 
    <OBJECT> 
     <CONTENT> 
      <STRUCT> 
       <STRING ID="1">string1</STRING> 
      </STRUCT> 
      <STRUCT> 
       <STRING ID="2">string2</STRING> 
      </STRUCT> 
     </CONTENT> 
    </OBJECT> 
    <OBJECT> 
     <CONTENT> 
      <STRUCT> 
       <STRING ID="333">string333</STRING> 
      </STRUCT> 
      <STRUCT> 
       <STRING ID="345">string345</STRING> 
      </STRUCT> 
     </CONTENT> 
    </OBJECT> 
</OBJECTS> 

如上所述,這是重新創建<OBJECT><CONTENT>元素,因此對這些元件的任何屬性將丟失。