2010-07-23 11 views
15

Ich habe ein wenig Probleme bei der Suche nach der richtigen XPath-Syntax, um zu überprüfen, ob ein bestimmter Knoten in meinem XML vorhanden ist. Ich darf nur XPath verwenden (also keine XSL oder etwas anderes, es muss eine reine XPath-Ausdruckssyntax sein).XPath-Prüfung für nicht vorhandenen Knoten

Ich habe ein XML und es hat einen Knoten Filename, aber es existiert nicht in jedem Fall. Wenn der Dateiname nicht angegeben wird, verwendet mein LiveCycle-Prozess eine andere Route, um den Dateinamen einzugeben. Aber wie überprüfe ich, ob der Filename Knoten existiert?

+0

Gute Frage (+1). Siehe meine Antwort für eine Erklärung und für einen kurzen einzelnen XPath-Ausdruck, der entweder den Dateinamen oder den Standard auswählt, falls der Dateiname fehlt. :) –

Antwort

14

Sie können die Funktion count verwenden - den Pfad der Knoten übergeben, die Sie überprüfen.

Wenn sie nicht vorhanden sind, dann wird der Wert von count 0 sein:

count(//Filename) = 0 
8

Angenommen, Sie das folgende XML-Dokument haben:

<top> 
    <function> 
    <filenamex>c:\a\y\z\myFile.xml</filenamex> 
    <default>Default.xml</default> 
    </function> 
</top> 

dann dieser Ausdruck XPath wählt entweder das filename Element, wenn es vorhanden ist oder das default Element, wenn kein filename Element angegeben ist:

(/*/function/filename 
| 
/*/function/default 
) 
    [1] 

Der kürzeste Weg, wenn das filename Element besteht zu überprüfen:

/*/function/filename

So ist der erste XPath-Ausdruck neu geschrieben werden könnte, in den äquivalenten (aber etwas länger) :

/*/function/filename 
| 
/*/function/default[not(/*/function/filename)] 
12

Ähnlich wie zu zählen aber vielleicht mehr direkt abhängig von dem, was Sie wollen, ist die Funktion boolean

boolean(//Filename)

Das gibt wahr wenn „Dateiname“ Knoten existieren und falsch, wenn nicht.

+0

Ist es möglich, das zurückgegebene Ergebnis zu negieren? So etwas wie '! boolean (...) '... – Aerendir

+0

Etwas kryptische Absicht, nicht wahr? –

5

das Beispiel XML-Daten aus einer anderen Antwort

<top> 
    <function> 
    <filenamex>c:\a\y\z\myFile.xml</filenamex> 
    <default>Default.xml</default> 
    </function> 
</top> 
  • Um Knoten mit dem Knoten "filenamex" Verwendung/top/Funktion [filenamex]
  • Um Knoten ohne Knoten "filenamex" Verwendung/top zu erhalten/Funktion [nicht (filenamex)]

ich fühlte es notwendig, hier wie die anderen Antworten als beworben hat nicht zu beantworten in XmlSpy

Verwandte Themen