2014-05-06 12 views
5

Ich habe den folgenden XPath-Ausdruck:XPath funktioniert nicht mit xmlns

/configuration/properties 

Und das ist mein XML:

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

Die XPath funktioniert nicht. Jedoch Wenn ich den Namen Raum xmlns-xmlns:conf ändern funktioniert es:

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

Warum das so ist?

+2

Diese Seite gibt es auch für „XPath Standard-Namespace“ Suche und Sie werden 1030 Antworten auf Ihre Fragen bekommen, fast alle von ihnen richtig. –

+1

@MichaelKay Sie haben Recht. Aber dafür sollte man wissen, wonach man suchen soll (Und ich bin nicht der Autor des Autors von 'XSLT 2.0 und XPath 2.0 Programmer's Reference') :) –

+0

Ja, das Finden der richtigen Suchbegriffe ist schwierig, besonders für Leute, die ' Ich habe die Terminologie gelernt. Der Titel, den Sie für Ihre Frage gewählt haben, ist jedoch gut genug, um 223 Treffer zu erhalten. –

Antwort

8

Platzierung xmlns="http://www.ksharma.in/myXSD" auf das Wurzelelement Ihrer XML setzt die Wurzel und seine Nachkommen in der http://www.ksharma.in/myXSD Namespace. Dies bedeutet effektiv, dass allen Elementnamen in Ihrem XML-Dokument http://www.ksharma.in/myXSD vorangestellt wird. Die in Ihrem XPath angegebenen Elemente sind jedoch nicht in dem Namespace http://www.ksharma.in/myXSD. Daher entspricht Ihr XPath nichts.

Platzierung xmlns:conf="http://www.ksharma.in/myXSD" stattdessen auf das Wurzelelement definiert lediglich ein Präfix für die http://www.ksharma.in/myXSD Namespace aber eigentlich gar nicht verwenden. Das Root-Element und seine Nachkommen bleiben in keinem Namespace und können daher von Ihrem XPath gefunden werden, der auch in keinem Namespace testet. Daher entspricht Ihr XPath etwas.

Siehe How does XPath deal with XML namespaces?

3

Das liegt daran, dass Sie sich in einem Standardnamespace xmlns="http://www.ksharma.in/myXSD" befinden. Sie können versuchen

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

stattdessen.

3

Namespace ohne Präfix ist ein Standardnamespace. Standard-Namespace, XML-Element, in dem der Namespace deklariert ist, und Nachkommen ohne Präfix und ohne unterschiedliche Namespace-Deklaration ohne Präfix, die im selben Namespace berücksichtigt werden.

Die zweite XML oben hat Namespace-Deklaration mit Präfix. In diesem Fall muss ein Element, das in diesem Präfix-Namespace berücksichtigt werden soll, explizit mit dem entsprechenden Präfix deklariert werden.

Um auf Elemente im Standard-Namespace zugreifen zu können, müssen Sie ein Präfix angeben, das auf den Standard-Namespace-URI verweist. Verwenden Sie dieses Präfix in Ihrer XPath-Abfrage (oder ignorieren Sie den Namespace mit local-name() wie in @ Joels Antwort vorgeschlagen).