我有以下XML,它是由第三方库生成的:
<PhoneNumbers>
<PhoneNumber Key="1">123-456-7890</PhoneNumber>
<PhoneNumber Key="2">234-567-8901</PhoneNumber>
<PhoneNumber Key="3">345-678-9012</PhoneNumber>
</PhoneNumbers>
问题在于我不应该依赖于按顺序出现的Key
属性(a)的值,或者(b)从1开始。更多是后者,但我希望此处理为尽可能安全。
我需要做的是获取电话号码列表,按Key
值(升序)排序。因此,使用XmlNode.SelectNodes
我希望生成的XmlNodeList
按正确顺序包含PhoneNumber
个节点,而不一定按照它们出现的顺序。
如何使用XPath完成此任务?
这可以直接做到吗?
如果它有所作为,我正在使用.NET 2.0。
答案 0 :(得分:4)
XPathExpression类提供AddSort方法:
http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathexpression.aspx
答案 1 :(得分:4)
Xpath本身没有为此定义任何内容。
对于C#.NET,这可能是您正在寻找的: http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/ba975e0e-e0c7-4868-9acc-11d589cafc70/
答案 2 :(得分:3)
使用XPath无法实现。如果您使用的是XPathDocument
,则可以使用AddSort
方法。
但是,如果您已经在使用XmlDocument(和/或需要能够更新XML DOM),那么可能只需使用Key属性的值将SelectNodes的结果转储到SortedDictionary
中即可。关键值。
答案 3 :(得分:3)
以下是使用已提到的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++;
}
}