从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但我没有得到任何结果。
再次感谢您的回复。
答案 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));