C# 在使用Xpath表达式后,无法使用XmlDocument()保存新的xml文件。AddSort(…)
我正在使用C#.NET 2.0,希望使用XPath对xml文件进行排序,然后使用xmlDoc.save保存它。但是,保存的xml文件与原始xml相同,无需XPath处理。代码如下: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 =
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");