2009-05-01 14 views
18

mio XPath è un po 'arrugginito ... Diciamo che ho questo semplice file XML:Come filtrare con XPath su tutti gli elementi senza un attributo specifico

<?xml version="1.0" encoding="utf-8" ?> 
<States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<States> 
<StateProvince name="ALABAMA" abbrev="AL" /> 
.... 
<StateProvince name="AMERICAN SAMOA" abbrev="AS" territory="true" /> 
</States> 
</States> 

Vorrei eseguire una semplice query XPath per analizzare tutti gli stati veri (quindi non inserire stati dove territorio = true). Ho provato \ StateProvince [@territory! = 'True'] ma ho ottenuto zero. Altre variazioni sembrano fallire. Sembra che dovrebbe essere semplice, ma non trovare quello che voglio.

Qualsiasi aiuto apprezzato.

+0

Specialmente se si è nuovi a XPath, è necessario prendere in considerazione considerazioni come sollevate nella mia soluzione: si deve evitare l'// abbreviazione ogni volta che è possibile poiché esso fa sì che l'intero documento (sottostruttura radicata al nodo di contesto) venga scansionato . –

+0

Anche per i documenti XML di piccole dimensioni che utilizzano '//' può influire negativamente sulle prestazioni (se queste espressioni XPath vengono emesse frequentemente). Inoltre, se ci si abitua a '//' con piccoli documenti, allora le probabilità sono grandiose che dimenticherà e userà con documenti più grandi e quindi creerà un disastro di prestazioni. Dopo tutto, chi decide quanto piccolo è "piccolo" e dove smette di essere "piccolo"? –

risposta

30

espressione Uno XPath che seleziona gli elementi desiderati:

                /*/States/StateProvince[not(@territory='true')]

Do atto che si deve evitare la sigla // quando possibile come provoca l'intero documento (sottoalbero al nodo contesto) da scannerizzare.

L'espressione XPath sopra evita l'uso del//abbreviazione tenendo conto della struttura del documento XML originariamente previsto.

Solo se la struttura del documento XML è completamente sconosciuto (e l'espressione XPath è destinato ad essere utilizzato attraversato molti documenti XML con struttura sconosciuta) dovrebbe l'uso del // abbreviazione essere considerato.

+0

Sono d'accordo che questa è anche una buona pratica, ma nel mio caso è solo un piccolo xml che verrà memorizzato nella cache dopo che è stato caricato. – lyngbym

+0

@lyngbym Anche per i documenti XML di piccole dimensioni che utilizzano '//' può influire negativamente sulle prestazioni (se queste espressioni XPath vengono emesse frequentemente). Inoltre, se ci si abitua a '//' con piccoli documenti, allora le probabilità sono grandiose che dimenticherà e userà con documenti più grandi e quindi creerà un disastro di prestazioni. Dopo tutto, chi decide quanto piccolo è "piccolo" e dove smette di essere "piccolo"? –

6

Vi sono molto vicino:

//StateProvince[not(@territory) or @territory != 'true'] 

dovrebbe ottenere il risultato desiderato.

2

Questo dovrebbe funzionare:

//StateProvince[not(@territory='true')] 
Problemi correlati