2009-01-23 13 views
22

que tienen la siguiente estructura XML de ejemplo:XPATH de elementos múltiples filtros

<SavingAccounts> 
    <SavingAccount> 
     <ServiceOnline>yes</ServiceOnline> 
     <ServiceViaPhone>no</ServiceViaPhone> 
    </SavingAccount> 
    <SavingAccount> 
     <ServiceOnline>no</ServiceOnline> 
     <ServiceViaPhone>yes</ServiceViaPhone> 
    </SavingAccount> 
</SavingAccounts> 

Lo que tengo que hacer es filtrar los nodos de la 'SavingAccount' usando XPath en el que el valor de 'ServiceOnline' es 'sí' o el valor de 'ServiceViaPhone' es sí.

¡El XPATH debería devolverme dos filas! Puedo filtrar nodos 'SavingAccount' donde los dos valores de los elementos son sí, como la siguiente muestra XPATH, pero lo que quiero hacer es una comparación de valores de elementos o ???

/SavingAccounts/SavingAccount/ServiceOnline[text()='yes']/../ServiceViaPhone[text()='yes']/.. 

Respuesta

52

Esta es una característica muy XPath fundamental: componer un número de condiciones con los operadores lógicos and, or, y la función not().

and tiene una prioridad más alta que or y ambos operadores tienen menor prioridad que los relational y equality operadores (=, !=, >, >=, &lt; y &lt;=).

Por lo tanto, es seguro para escribir: A = B and C = D

Algunos errores más frecuentes hechas:

  1. La gente escribe AND y/o OR. Recuerde, XPath distingue entre mayúsculas y minúsculas.

  2. La gente usa la (unión) en lugar de or

Por último |, aquí está mi solución:

 
/SavingAccounts/SavingAccount 
      [ServiceOnLine='yes' or ServiceViaPhone='yes'] 

4

Will

/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes'] 

hacer el truco?

No tengo ningún evaluador de XPath a la mano en este momento.

EDIT:
Si no recuerdo mal, no es necesario el texto(), por lo

[ServiceOnline='yes' or ServiceViaPhone='yes'] 

debería ser suficiente, y más legible.

EDIT:
Sí, por supuesto, 'o' para expresiones de predicado, mi mal.

+1

/SavingAccounts/SavingAccount [ServiceOnline/texto() = 'sí' o ServiceByPhone/text() = 'yes'] –

+0

Entonces, la XPATH era correcta, excepto t necesita "o" en lugar de "|". Pero eso podría ser una peculiaridad del analizador .NET XML/XPATH. – gilles27

9
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')] 
+1

Bueno, pero los corchetes no son necesarios :) –

+1

@DimitreNovatchev, quieres decir, los parens? –

+0

@JonL. Sí, ¿no son sinónimos "paréntesis" y "paréntesis"? –

Cuestiones relacionadas