簡體   English   中英

LINQ XML查詢方式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM