[英]LINQ Order By Query for XML
嗨,我有以下問題:
我正在嘗試對XML文件執行以下操作:根據STRING的ID屬性對所有STRUCT排序。 但是返回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?
謝謝
搶
我認為單個linq查詢不能為您提供所需的輸出。 為了正確地創建一個具有與原始xml相同結構的新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)))
)
)
)
如果您的<OBJECT><CONTENT>
層次結構是靜態的(沒有屬性等需要復制到輸出中),則可以在一個LINQ查詢中使用VB.NET對帶有嵌入式查詢的XML文字的精妙支持來完成此操作。
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>.@ID) 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>
元素,因此這些元素上的所有屬性都將丟失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.