使用Xpath表达式后无法使用XmlDocument()保存新的xml文件.AddSort(...)

时间:2017-09-20 10:05:34

标签: c# xml xpath

我使用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的新手。我需要你的帮助。非常感谢您的努力。

非常感谢。

2 个答案:

答案 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");