XPATH Filtri ad elementi multipli
-
19-08-2019 - |
Domanda
Ho la seguente struttura XML di esempio:
<SavingAccounts>
<SavingAccount>
<ServiceOnline>yes</ServiceOnline>
<ServiceViaPhone>no</ServiceViaPhone>
</SavingAccount>
<SavingAccount>
<ServiceOnline>no</ServiceOnline>
<ServiceViaPhone>yes</ServiceViaPhone>
</SavingAccount>
</SavingAccounts>
Quello che devo fare è filtrare i nodi 'SavingAccount' usando XPATH dove il valore di 'ServiceOnline' è 'yes' o il valore di 'ServiceViaPhone' è yes.
L'XPATH dovrebbe restituirmi due righe !! Posso filtrare i nodi 'SavingAccount' in cui entrambi i valori degli elementi sono sì come il seguente esempio XPATH, ma quello che voglio fare è un confronto tra i valori degli elementi ???
/SavingAccounts/SavingAccount/ServiceOnline[text()='yes']/../ServiceViaPhone[text()='yes']/..
Soluzione
Questa è una caratteristica XPath fondamentale: comporre una serie di condizioni con gli operatori logici e
, o
e la funzione not ()
.
e
ha una priorità superiore a o
ed entrambi gli operatori hanno una priorità inferiore rispetto a relazionale e uguaglianza operatori ( =
, ! =
, >
, > =
, & amp; lt;
e & amp; lt; =
).
Quindi, è sicuro scrivere : A = B e C = D
Alcuni errori più frequenti commessi :
-
Le persone scrivono
AND
e / oOR
. Ricorda, XPath distingue tra maiuscole e minuscole . -
Le persone usano l'operatore
|
(unione) anzichéo
Infine, ecco la mia soluzione :
/SavingAccounts/SavingAccount [ServiceOnLine='yes' or ServiceViaPhone='yes']
Altri suggerimenti
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
Will
/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes']
fai il trucco?
Al momento non ho un valutatore XPath a portata di mano.
EDIT:
Se ricordo bene, non hai bisogno del testo (), quindi
[ServiceOnline='yes' or ServiceViaPhone='yes']
dovrebbe essere sufficiente e più leggibile.
EDIT:
Sì, certo, "o" per le espressioni predicate, mio ??male.