2010-10-14 11 views
9

Nie można uzyskać następującego wyrażenia Xpath do pracy, gdy ustawiony jest prefiks przestrzeni nazw ścieżki XML.Wyrażenie xpath z xml z prefiksem przestrzeni nazw

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

XML jest:

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

Opublikuj kod, który wykonuje zapytanie XPath. – Tomalak

+3

Należy przekazać powiązanie prefiksu/przestrzeni nazw URI do silnika XPath. Czemu? Ponieważ przedrostki nie są ważne dla testu nazwy, ale URI przestrzeni nazw są. Zatem 'a: node' może wybrać' b: node', o ile przedrostki 'a' i' b' wiążą się z tym samym identyfikatorem URI przestrzeni nazw. –

Odpowiedz

12

Bez Więcej informacji na temat języka gospodarza (w którym próba oceny wyrażeń XPath) nie jest możliwe dostarczenie przydatnych rekomendacji.

Zasadniczo konieczne jest "zarejestrowanie" obszaru nazw za pomocą menedżera przestrzeni nazw, co również wiąże prefiks z zarejestrowaną przestrzenią nazw. Następnie, używając tego obiektu NamespaceManager jako argumentu do metody oceny XPath, można określić jako argument tej metody wyrażenie XPath zawierające nazwy poprzedzone tym konkretnym przedrostkiem.

Obejścia:

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

Używam podpisu xml w java. Chcę wybrać elementy, które mają być podpisane za pomocą xpath w sekcji trasnforms. Jak podać wyrażenie xpath, gdy mam prefiksy i przestrzenie nazw w moim dokumencie xml. – Ashwin

+1

@Ashwin: Ta odpowiedź pokazuje dokładnie, jak to zrobić (jeden z możliwych sposobów), bez rejestrowania przestrzeni nazw. Drugim możliwym sposobem jest zarejestrowanie przestrzeni nazw w celu powiązania prefiksów, w których nazwami elementów przywołanymi w wyrażeniu XPath są - wówczas wyrażenie XPath może zawierać prefiksy i być bardziej czytelne. Ta druga metoda wymaga użycia przestrzeni nazw rejestrujących interfejsy API implementowane przez implementację i trzeba przeczytać odpowiednią dokumentację. –

24

Albo jeszcze lepiej (i bardziej przenośny), bez zbędnego przedrostka:

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

The function local-name ignoruje żadnego prefiksu, który, jak słusznie stwierdził przez komentujących, puszka różnią się.

+1

Dlaczego ktoś zignorował to? Znalazłem to doskonałe rozwiązanie, aby uniknąć zajmowania przestrzeni nazw, które są denerwujące i niepotrzebne w 99% przypadków. – Arne

+0

Jeśli przestrzenie nazw są tylko przeszkodą, którą trzeba przejść, narzuconą zewnętrznie - jak to często bywa - to zdecydowanie jest droga. – joachim

Powiązane problemy