2010-10-14 24 views
9

Impossibile ottenere che la seguente espressione xpath funzioni quando viene impostato il prefisso dello spazio dei nomi del percorso xml.espressione xpath da xml con prefisso dello spazio dei nomi

/bk:BookStore/bk:Books/bk:Book[text()='Time Machine']

XML è:

<BookStore xmlns:bk="http://www.bookstore.com/book#"> 
    <bk:Books> 
    <bk:Book id="1">Time Machine></bk:Book> 
    </bk:Books> 
</bk:BookStore> 
+0

Pubblica il codice che esegue la query XPath. – Tomalak

+3

È necessario passare l'associazione URI del prefisso/spazio dei nomi al proprio motore XPath. Perché? Perché i prefissi non sono importanti per il test dei nomi, ma lo sono gli URI dello spazio dei nomi. Quindi 'a: node' potrebbe selezionare' b: node' a patto che i prefissi 'a' e' b' siano vincolati allo stesso URI dello spazio dei nomi. –

risposta

12

Senza ulteriori informazioni sulla lingua del paese ospitante (in cui si cerca di valutare le espressioni XPath) non è possibile fornire una raccomandazione utile.

In genere, è necessario "registrare" uno spazio dei nomi con un gestore di spazi dei nomi e questo associa anche un prefisso allo spazio dei nomi registrato. Quindi, usando questo oggetto NamespaceManager come argomento per il metodo di valutazione XPath, si può specificare come argomento a questo metodo un'espressione XPath che contiene nomi preceduti da quel particolare prefisso.

Soluzioni alternative:

/*/*[name()='bk:Books']/*[name()='bk:Book' and text()='Time Machine'] 
+0

Sto usando la firma xml in java. Desidero selezionare gli elementi da firmare usando xpath nella sezione trasnforms. Come faccio a dare l'espressione xpath quando ho prefissi e namespace nel mio documento xml. – Ashwin

+1

@Ashwin: questa risposta mostra esattamente come fare questo (uno dei modi possibili), senza registrare spazi dei nomi. Il secondo modo possibile è registrare lo spazio dei nomi come prefisso ai collegamenti in cui i nomi degli elementi referenziati nell'espressione XPath sono - quindi l'espressione XPath può contenere prefissi ed essere più leggibile. Questo secondo modo richiede di utilizzare per lo spazio dei nomi la registrazione delle API fornite dall'implementazione e occorre leggere la documentazione appropriata. –

24

O ancora meglio (e più portabile), senza il prefisso inutile:

/*/*[local-name()='Books'] ... and so on 

The function local-name ignora qualsiasi prefisso, che, come detto correttamente da commentatori, può variare.

+1

Perché qualcuno lo ha votato meno? Ho trovato questa una soluzione eccellente per evitare di trattare spazi dei nomi, che sono solo fastidiosi e inutili il 99% delle volte. – Arne

+0

Se gli spazi dei nomi sono solo un ostacolo, devi andare oltre, imposto esternamente - come spesso accade - allora questa è sicuramente la strada da percorrere. – joachim

Problemi correlati