如何使用子节点对 XML 元素进行排序?
How to order the XML element using the child node?
我想根据内部属性 "Top" 的值对 XML 个元素进行升序排序。
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Designer>
<Sequence>
<Left>603.875</Left>
<Top>312.665</Top>
<total>NaN</total>
<Width>58.5</Width>
<Height>45.5</Height>
<ID>635b1aed-6ee3-4cf5-9324-b0246f3a0c1d</ID>
<zIndex>0</zIndex>
<IsGroup>false</IsGroup>
<ParentID>00000000-0000-0000-0000-000000000000</ParentID>
<ItemLabel>123</ItemLabel>
</Sequence>
<Sequence>
<Left>568.875</Left>
<Top>29.664999999999992</Top>
<total>NaN</total>
<Width>58.5</Width>
<Height>45.5</Height>
<ID>9dd9a96d-4356-49c6-85a3-6b898983e688</ID>
<zIndex>1</zIndex>
<IsGroup>false</IsGroup>
<ParentID>00000000-0000-0000-0000-000000000000</ParentID>
<ItemLabel>321</ItemLabel>
</Sequence>
</Designer>
<Parameters>
<Value>
<Name> Label 1 </Name>
<ID> 1 </ID>
</Value>
<Value>
<Name> Label 2 </Name>
<ID> 2 </ID>
</Value>
</Parameters>
</Root>
这是我试过的代码。
try
{
XElement root = XElement.Load(MainWindow.Container.globalfilename +".xml");
var orderedtabs = root.Elements("Designer").Elements("Sequence")
.OrderBy(xtab => (float)xtab.Element("Top"))
.ToArray();
foreach (XElement tab in orderedtabs)
{
root.Add(tab);
}
root.Save("xmlfile" + ".xml");
MessageBox.Show("Sorted");
}
当我尝试创建一个新的 XML 文件时,标签被删除了。但我可以按顺序写。
但是,它的元素被删除了。
请在我出错的地方为我提供答案或更正。
提前致谢。
您的 Root、Designer 和 Parameters 标签被删除,因为您 select 只有 Sequences 标签,然后您将这些标签添加到根的顶部。我建议删除 Designer 下面的所有 Sequences 标签,然后重新在 Designer 下重新插入有序的 Sequences:
XElement root = XElement.Load("input.xml");
// Extract Sequences ordered by 'Top'
var orderedtabs = root.Elements("Designer").Elements("Sequence")
.OrderBy(xtab => (float)xtab.Element("Top"))
.ToArray();
// Remove Sequences from xml
root.Descendants("Designer").Elements("Sequence").Remove();
// Reinsert Sequences in new order under the Designer element
XElement designer = root.Descendants("Designer").FirstOrDefault();
foreach (XElement tab in orderedtabs)
{
designer.Add(tab);
}
root.Save("xmlfile" + ".xml");
我想根据内部属性 "Top" 的值对 XML 个元素进行升序排序。
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Designer>
<Sequence>
<Left>603.875</Left>
<Top>312.665</Top>
<total>NaN</total>
<Width>58.5</Width>
<Height>45.5</Height>
<ID>635b1aed-6ee3-4cf5-9324-b0246f3a0c1d</ID>
<zIndex>0</zIndex>
<IsGroup>false</IsGroup>
<ParentID>00000000-0000-0000-0000-000000000000</ParentID>
<ItemLabel>123</ItemLabel>
</Sequence>
<Sequence>
<Left>568.875</Left>
<Top>29.664999999999992</Top>
<total>NaN</total>
<Width>58.5</Width>
<Height>45.5</Height>
<ID>9dd9a96d-4356-49c6-85a3-6b898983e688</ID>
<zIndex>1</zIndex>
<IsGroup>false</IsGroup>
<ParentID>00000000-0000-0000-0000-000000000000</ParentID>
<ItemLabel>321</ItemLabel>
</Sequence>
</Designer>
<Parameters>
<Value>
<Name> Label 1 </Name>
<ID> 1 </ID>
</Value>
<Value>
<Name> Label 2 </Name>
<ID> 2 </ID>
</Value>
</Parameters>
</Root>
这是我试过的代码。
try
{
XElement root = XElement.Load(MainWindow.Container.globalfilename +".xml");
var orderedtabs = root.Elements("Designer").Elements("Sequence")
.OrderBy(xtab => (float)xtab.Element("Top"))
.ToArray();
foreach (XElement tab in orderedtabs)
{
root.Add(tab);
}
root.Save("xmlfile" + ".xml");
MessageBox.Show("Sorted");
}
当我尝试创建一个新的 XML 文件时,标签被删除了。但我可以按顺序写。 但是,它的元素被删除了。
请在我出错的地方为我提供答案或更正。
提前致谢。
您的 Root、Designer 和 Parameters 标签被删除,因为您 select 只有 Sequences 标签,然后您将这些标签添加到根的顶部。我建议删除 Designer 下面的所有 Sequences 标签,然后重新在 Designer 下重新插入有序的 Sequences:
XElement root = XElement.Load("input.xml");
// Extract Sequences ordered by 'Top'
var orderedtabs = root.Elements("Designer").Elements("Sequence")
.OrderBy(xtab => (float)xtab.Element("Top"))
.ToArray();
// Remove Sequences from xml
root.Descendants("Designer").Elements("Sequence").Remove();
// Reinsert Sequences in new order under the Designer element
XElement designer = root.Descendants("Designer").FirstOrDefault();
foreach (XElement tab in orderedtabs)
{
designer.Add(tab);
}
root.Save("xmlfile" + ".xml");