2010-12-14 9 views
75

Moim celem jest wyodrębnienie niektórych węzłów z wielu plików XML z wieloma przestrzeniami nazw przy użyciu XPath. Wszystko działa dobrze, o ile znam identyfikatory URI przestrzeni nazw. Nazwa przestrzeni nazw pozostaje niezmienna, ale Schematy (XSD) są czasami generowane przez klienta, tj. Nieznane mi. Wtedy ja zostaję z zasadniczo trzy możliwości:
jak zignorować przestrzenie nazw za pomocą XPath

  1. używać tylko jeden schemat dla przestrzeni nazw, w nadziei, nic się nie uda (? Mogę być pewny)

  2. dostać dzieciom węzły dokumentu i poszukaj pierwszego węzła z identyfikatorem URI przestrzeni nazw, mając nadzieję na jego obecność i po prostu użyj URI, mając nadzieję, że jest poprawny. można pomylić z wielu powodów

  3. jakoś powiedzieć XPath: „Słuchaj, ja nie dbają o przestrzeniach nazw, wystarczy znaleźć wszystkie węzły z tej nazwy, mogę nawet powiedzieć, że nazwa przestrzeni nazw, po prostu nie URI” . I jest to pytanie tutaj ...

To nie jest powtórzeniem licznej „Moja praca nie robi wyrażenie XPath, ponieważ nie jestem świadoma przestrzeni nazw świadomości” pytania jak znaleźć here lub here. Wiem, jak używać świadomości przestrzeni nazw. Po prostu nie jak się tego pozbyć.

+2

Jeśli nie znasz schematów, skąd wiesz, jakie elementy chcesz? –

+3

Dokładny duplikat [Jak ignorować przestrzeń nazw podczas analizowania dokumentu XML za pomocą XPath] (http://stackoverflow.com/questions/4402310/how-to-ignore-namespace-when-parsing-xml-document-with-xpath) –

+0

dziękuję za wskazanie, Alejandro. Szukanie "ignore namespace xpath" powinno ujawnić to, ale nie dało to – kostja

Odpowiedz

113

Można użyć funkcji XPath local-name(). Zamiast wybierania węzeł jak

/path/to/x:somenode 

można wybrać wszystkie węzły i filtrem do jednej z poprawną nazwą lokalnego:

/path/to/*[local-name() = 'somenode'] 
+6

Możesz również użyć 'local-name()', aby odnosić się również do atrybutów, w sposób nieświadomy przestrzeni nazw, zobacz: http://stackoverflow.com/q/21239181/274677 –

+0

Zobacz w tym samouczku: http://www.codesimplify.com/java/java-xpath-ignore-namespace-example/ – hipokito

9

Można zrobić to samo w XPath2.0 w mniej pełna składnia:

/path/to/*:somenode