2009-01-23 22 views
22

ho la seguente struttura XML di esempio:XPATH multipla Element Filtri

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

Che cosa devo fare è di filtrare i nodi del 'SavingAccount' utilizzando XPath in cui il valore di 'ServiziCatalogo' è 'sì' o il valore di 'ServiceViaPhone' è sì.

XPATH dovrebbe restituirmi due righe !! Posso filtrare i nodi 'SavingAccount' in cui entrambi i valori degli elementi sono sì come il seguente esempio di XPATH, ma quello che voglio fare è un confronto tra valori o elementi ???

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

risposta

52

Questa è una caratteristica molto XPath fondamentale: la composizione di un numero di condizioni con gli operatori logici and, or, e la funzione not().

and ha una priorità maggiore rispetto or e entrambi gli operatori hanno priorità inferiore rispetto ai relational e equality operatori (=, !=, >, >=, &lt; e &lt;=).

Quindi, è sicuro di scrivere: A = B and C = D

Alcuni errori più frequenti fatti:

  1. La gente scrive AND e/o OR. Ricordare che XPath distingue tra maiuscole e minuscole.

  2. La gente usa il (unione) operatore al posto di or

Infine |, ecco la mia soluzione:

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

4

Will

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

fare il trucco?

Non ho un valutatore XPath a portata di mano al momento.

EDIT:
Se non ricordo male, non occorre il testo(), in modo

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

dovrebbe essere sufficiente, e più leggibile.

EDIT:
Sì, certo, 'o' per le espressioni predicato, il mio male.

+1

/SavingAccounts/SavingAccount [ServiziCatalogo/text() = 'sì' o ServiceByPhone/text() = 'si'] –

+0

Quindi XPATH era corretto, eccezione t hai bisogno di "o" invece di "|". Ma potrebbe essere una particolarità del parser .NET XML/XPATH. – gilles27

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

Buono, ma le parentesi non sono necessarie :) –

+1

@DimitreNovatchev, vuoi dire, il paren? –

+0

@JonL. Sì, non sono sinonimi "parentesi" e "parentesi"? –