2014-05-06 11 views
5

Mam następujące wyrażenie XPath:Xpath nie działa z xmlns

/configuration/properties 

I to jest mój XML:

<configuration 
    xmlns="http://www.ksharma.in/myXSD"> 
    <properties> 
     <property key="a" value="1" /> 
     <property key="b" value="2" /> 
    </properties> 
</configuration> 

XPath nie działa. Gdybym jednak zmienić przestrzeń nazw z xmlns do xmlns:conf to działa:

<configuration 
    xmlns:conf="http://www.ksharma.in/myXSD"> 
    <properties> 
     <property key="a" value="1" /> 
     <property key="b" value="2" /> 
    </properties> 
</configuration> 

Dlaczego tak jest?

+2

Wyszukiwanie w witrynie dla „domyślnej przestrzeni nazw XPath”, a dostaniesz 1030 odpowiedzi na swoje pytanie, prawie wszystkie z nich poprawne. –

+1

@MichaelKay Masz rację. Ale do tego należy wiedzieć, czego szukać (i nie jestem autorem "XSLT 2.0 i XPath 2.0 Programmer's Reference") :) –

+0

Tak, znalezienie właściwych haseł wyszukiwania jest trudne, szczególnie dla osób, które mają " t nauczyłem się terminologii. Jednak tytuł, który wybrałeś na swoje pytanie, jest wystarczająco dobry, aby uzyskać 223 trafienia. –

Odpowiedz

8

Umieszczenie xmlns="http://www.ksharma.in/myXSD" na elemencie głównym swojej XML stawia korzeń i jego potomków w przestrzeni nazw http://www.ksharma.in/myXSD. Oznacza to, że wszystkie nazwy elementów w dokumencie XML są poprzedzone http://www.ksharma.in/myXSD. Jednak elementy podane w XPath są nie w przestrzeni nazw . Tak więc twój XPath nic nie pasuje do.

Umieszczenie xmlns:conf="http://www.ksharma.in/myXSD" zamiast na elemencie głównym jedynie definiuje prefiksu dla przestrzeni nazw http://www.ksharma.in/myXSD ale faktycznie nie używać. Element główny i jego potomkowie pozostają bez przestrzeni nazw i dlatego można je znaleźć przez XPath, który również testuje w przestrzeni nazw. W ten sposób twój XPath pasuje do czegoś.

Zobacz także How does XPath deal with XML namespaces?

3

Dzieje się tak dlatego, że znajdujesz się w domyślnej przestrzeni nazw xmlns="http://www.ksharma.in/myXSD". Zamiast tego możesz wypróbować

/*[local-name()='configuration']/*[local-name()='properties'] 

.

3

Przestrzeń nazw z przedrostkiem to domyślny obszar nazw. Mając domyślny obszar nazw, element XML, w którym deklarowana jest przestrzeń nazw, i jego potomkowie bez prefiksu i bez różnej nieprefiksowanej deklaracji przestrzeni nazw rozpatrywanej w tej samej przestrzeni nazw.

Drugi powyższy XML ma deklarację przestrzeni nazw z prefiksem. W takim przypadku dla elementu, który ma być uwzględniony w tej przestrzeni nazw z prefiksem, musi zostać zadeklarowany jawnie za pomocą odpowiedniego przedrostka.

Aby mieć dostęp do elementów w domyślnej przestrzeni nazw trzeba zadeklarować prefiks które wskazują na domyślnej przestrzeni nazw URI i użyć tego przedrostka w zapytaniu XPath (lub ignorować nazw za pomocą local-name() jak sugeruje @ odpowiedź Joela).