2010-01-11 3 views
6

tengo el siguiente código XML, que se genera por una biblioteca de 3 ª parte:¿Cómo se especifica el orden de los resultados del nodo con XPath?

<PhoneNumbers> 
    <PhoneNumber Key="1">123-456-7890</PhoneNumber> 
    <PhoneNumber Key="2">234-567-8901</PhoneNumber> 
    <PhoneNumber Key="3">345-678-9012</PhoneNumber> 
</PhoneNumbers>

La cuestión es que no debería depender de los valores del atributo Key (a) que aparece en orden, o (b) comenzando en 1. Más que esto último, pero quiero que este procesamiento sea lo más seguro posible.

Lo que necesito hacer es obtener una lista de los números de teléfono, ordenados por el valor Key (ascendente). Entonces, al usar XmlNode.SelectNodes, me gustaría que el XmlNodeList resultante contenga los nodos PhoneNumber en el orden correcto, no necesariamente en el orden en que aparecen.

¿Cómo se puede lograr esto con XPath?
¿Es posible hacerlo directamente?

Si hace una diferencia, estoy usando .NET 2.0.

Respuesta

3

Esto no se puede lograr con XPath. Si estuviera usando un XPathDocument, podría usar el método AddSort.

Sin embargo, si ya está utilizando XmlDocument (y/o necesita actualizar el DOM de XML) probablemente solo sea fácil volcar el resultado de SelectNodes en un SortedDictionary usando el valor del atributo clave como valor clave .

3

Aquí hay un ejemplo de cómo hacerlo con XPathExpression utilizando el método AddSort ya mencionado. XPathExpression está disponible with.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++; 
    } 
} 
Cuestiones relacionadas