如何使用XPath指定节点结果顺序?
我有以下XML,它由第三方库生成:
123-456-7890 234-567-8901 345-678-9012
问题是我不应该依赖Key
属性(a)按顺序出现的值,或者(b)从1开始。更多是后者,但我希望这个处理尽可能安全。
我需要做的是获取电话号码列表, Key
值(升序)排序。 因此,通过使用XmlNode.SelectNodes
我希望生成的XmlNodeList
以正确的顺序包含PhoneNumber
节点,而不一定按照它们出现的顺序。
如何使用XPath实现这一目标?
这可以直接做吗?
如果它有所作为,我使用的是.NET 2.0。
Xpath本身没有为此定义任何内容。
对于C#.NET,这可能是您正在寻找的: http : //social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/ba975e0e-e0c7-4868-9acc-11d589cafc70/
XPathExpression类提供AddSort方法:
http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx
使用XPath无法实现这一点。 如果您使用的是XPathDocument
,则可以使用AddSort
方法。
但是,如果您已经在使用XmlDocument(和/或需要能够更新XML DOM),则可能只需使用Key属性的值作为Key值将SelectNodes的结果转储到SortedDictionary
。
以下是使用已提到的AddSort方法使用XPathExpression进行操作的示例。 XPathExpression可与.Net 2.0一起使用( http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx )
private static void XmlTest() { XPathDocument results = new XPathDocument(@"c:\temp\temp.xml"); XPathNavigator navigator = results.CreateNavigator(); XPathExpression selectExpression = navigator.Compile("/PhoneNumbers/PhoneNumber"); XPathExpression sortExpr = navigator.Compile("@Key"); selectExpression.AddSort(sortExpr, XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text); XPathNodeIterator nodeIterator = navigator.Select(selectExpression); int i = 0; while (nodeIterator.MoveNext()) { Console.WriteLine(nodeIterator.Current.Value); i++; } }