2014-10-27 111 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>元素,因此对这些元件的任何属性将丢失。