C# 在使用Xpath表达式后,无法使用XmlDocument()保存新的xml文件。AddSort(…)

C# 在使用Xpath表达式后,无法使用XmlDocument()保存新的xml文件。AddSort(…),c#,xml,xpath,C#,Xml,Xpath,我正在使用C#.NET 2.0,希望使用XPath对xml文件进行排序,然后使用xmlDoc.save保存它。但是,保存的xml文件与原始xml相同,无需XPath处理。代码如下: public static void SortOneLevel() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("abc.xml"); XPathNavigator navigator =

我正在使用C#.NET 2.0,希望使用XPath对xml文件进行排序,然后使用xmlDoc.save保存它。但是,保存的xml文件与原始xml相同,无需XPath处理。代码如下:

    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>
这意味着表达式已成功对其排序。但是,你能告诉我如何保存它吗? 我是XML的新手。我需要你的帮助。非常感谢你的努力


非常感谢。

正如评论中提到的,XPath是一种查询语言-您不能使用XPath修改文档

您可以使用LINQ to XML获取
测试
元素,对它们进行排序,然后将它们添加到新文档中:

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

请参阅演示。

XPath仅用于xml请求,不用于修改。非常感谢Alexander Petrov。如果我想将此请求保存为新的xml文件,该怎么办?非常感谢Charles Mager。这是一个很好的解决方案。但是,我在ly.NET2.0上使用,它没有linq。你知道吗?哪种方法最好?“我想它唯一的XPath可以轻松做到这一点。”newbuntu抱歉,我错过了问题中的注释。是否有无法更新的原因?对.NET 2.0和.NET 3.5 SP1或.NET 4.5.2及更高版本的支持都包含LINQ到XMLOK,当然,谢谢Charles Mager。虽然不受支持,但我的要求是.NET2.0。我想我必须使用XSLT对xml文件进行三级排序。干杯
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");
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");