使用linq2xml订购xml文件

时间:2012-06-13 09:27:42

标签: .net xpath linq-to-xml

关注问题Filter xml with LINQ2XML

从xml文件中成功过滤(删除节点)后。我想通过节点中的某些属性来订购。

xml文件示例:

<Root> 
   <Group Price="50"> 
       <Item Price="60"/> 
       <Item Price="50"/> 
       <Item Price="70"/> 
   </Group> 
   <Group Price="55"> 
       <Item Price="62"/> 
       <Item Price="57"/> 
       <Item Price="55"/> 
   </Group> 
   <Group Price="61"> 
       <Item Price="62"/> 
       <Item Price="61"/> 
       <Item Price="65"/> 
    </Group> 
    <!--More Group Nodes-->  
</Root> 

我想得到:

<Root> 
   <Group Price="61"> 
       <Item Price="65"/> 
       <Item Price="62"/> 
       <Item Price="61"/> 
    </Group> 
    <Group Price="55"> 
       <Item Price="62"/> 
       <Item Price="57"/> 
       <Item Price="55"/> 
   </Group> 
   <Group Price="50"> 
       <Item Price="70"/> 
       <Item Price="60"/> 
       <Item Price="50"/> 
   </Group> 
   <!--More Group Nodes-->  
</Root>

我目前的代码是(Mix LINQ2Xml和XPATH):

'First I remove Group nodes with prices higher than 60 (and their sons).

dim filter as String="./Root/Group[not(translate(@Price, ',.', '.')<=60})]"

elements = doc.XPathSelectElements(filter).OrderByDescending((Function(x) CType(x.Attribute("Price"), Decimal)))

'Remove elements what don't fullfill the condition  (prices higher than 60)                   
elements.Remove()

'After I remove Item nodes with prices higher than 60

filter as String="./Root/Group/Item[not(translate(@Price, ',.', '.')<=60})]"

elements = doc.XPathSelectElements(filter).OrderByDescending((Function(x) CType(x.Attribute("Price"), Decimal)))

'Remove elements what don't fullfill the condition  (prices higher than 60)
 elements.Remove()

正如我之前所说,我成功过滤但我无法订购(在这种情况下降序)。 有没有办法在一个步骤中订购组节点和项目节点,或者我必须分两步完成它?

有人告诉我使用XDocument的replaceNodes但我没有得到任何结果。

再次感谢您的回复。

1 个答案:

答案 0 :(得分:0)

如果您想按顺序对组进行排序,则可以使用LINQ和OrderByDescending。

XDocument doc = XDocument.Parse("<Root>  <Group Price=\"50\">  <Item Price=\"60\"/>  <Item    Price=\"50\"/>  <Item Price=\"70\"/>  </Group>  <Group Price=\"55\">  <Item Price=\"62\"/>  <Item Price=\"57\"/>  <Item Price=\"55\"/>  </Group>  <Group Price=\"61\">  <Item Price=\"62\"/>  <Item Price=\"61\"/> <Item Price=\"65\"/>  </Group>  <!--More Group Nodes-->   </Root>  ");

IEnumerable<XElement> list = doc.Elements()
                                .Elements("Group")
                                .OrderByDescending(p => Convert.ToInt32(p.Attribute("Price").Value));