我使用C#.NET 2.0并希望使用XPath对xml文件进行排序,然后使用xmlDoc.Save保存它。但是,保存的xml文件与没有XPath处理的原始xml相同。这是代码:
public static void SortOneLevel()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("abc.xml");
XPathNavigator navigator = xmlDoc.CreateNavigator();
XPathExpression expression = navigator.Compile("Root/Test");
expression.AddSort("TestPhase", XmlSortOrder.Ascending, XmlCaseOrder.None, string.Empty, XmlDataType.Number);
xmlDoc.Save("abc1.xml"); //check abc1, same as abc, not sorted
//Check if it is sorted
XPathNodeIterator iterator = navigator.Select(expression);
foreach (XPathNavigator item in iterator)
{
Console.WriteLine(item.Value); //Check printout, sorted
}
xmlDoc.Save("abc2.xml"); //check abc2, same as abc, not sorted
}
我的XML文件示例是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Test>
<TestPhase>222</TestPhase>
<TestFlow>1</TestFlow>
<TestParameter>1</TestParameter>
</Test>
<Test>
<TestPhase>214</TestPhase>
<TestFlow>1</TestFlow>
<TestParameter>2</TestParameter>
</Test>
<Test>
<TestPhase>1</TestPhase>
<TestFlow>3</TestFlow>
<TestParameter>1</TestParameter>
</Test>
<Test>
<TestPhase>1</TestPhase>
<TestFlow>2</TestFlow>
<TestParameter>2</TestParameter>
</Test>
<Test>
<TestPhase>2</TestPhase>
<TestFlow>1</TestFlow>
<TestParameter>1</TestParameter>
</Test>
.
.
.
.
</Root>
foreach循环内console.writeline的打印输出为:
131
122
211
212
221
222
311
.
.
.
.
1011
1012
1021
1022
21412
22211
这意味着表达式已成功对其进行排序。但是,我可以告诉你如何保存它吗? 我是XML的新手。我需要你的帮助。非常感谢您的努力。
非常感谢。
答案 0 :(得分:0)
正如评论中所提到的,XPath是一种查询语言 - 您不能使用XPath来修改文档。
您可以使用LINQ to XML获取Test
元素,对它们进行排序,然后将它们添加到新文档中:
var original = XDocument.Load("abc1.xml");
var sorted = new XDocument(
new XElement("Root",
original.Elements("Root")
.Elements("Test")
.OrderBy(x => (int) x.Element("TestPhase"))
)
);
sorted.Save("abc2.xml");
请参阅this fiddle了解演示。
答案 1 :(得分:0)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("abc.xml");
XPathNavigator navigator = xmlDoc.CreateNavigator();
XPathExpression expression = navigator.Compile("Root/Test");
expression.AddSort("TestPhase", XmlSortOrder.Ascending, XmlCaseOrder.None, string.Empty, XmlDataType.Number);
XPathNodeIterator iterator = navigator.Select(expression);
// Delete old (unsorted) nodes.
xmlDoc.DocumentElement.RemoveAll();
var rootNavigator = xmlDoc.DocumentElement.CreateNavigator();
// Add sorted nodes to root.
foreach (XPathNavigator item in iterator)
{
rootNavigator.AppendChild(item);
}
xmlDoc.Save("abc2.xml");