wake-up-neo.com

XPath: Wie werden Elemente basierend auf ihrem Wert ausgewählt?

Ich bin neu in der Verwendung von XPath und dies kann eine grundlegende Frage sein. Bitte nehmen Sie mit mir Kontakt auf und helfen Sie mir bei der Lösung des Problems. Ich habe eine XML-Datei wie diese:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

Ich kann das Vorhandensein eines <Element> - Tags überprüfen mit:

// Element [@ attribute1 = "abc" und @ attribute2 = "xyz"]

Jetzt möchte ich auch den Wert des Tags für den String "Data" Überprüfen. Um dies zu erreichen, wurde mir gesagt, zu verwenden:

// Element [@ attribute1 = "abc" und @ attribute2 = "xyz" und Daten]

Wenn ich den späteren Ausdruck verwende, wird folgende Fehlermeldung angezeigt:

Assertionsfehlermeldung: Keine Knoten gefunden //Element[@attribute1="abc" and @attribute2="xyz" and Data]

Bitte geben Sie mir Ihren Rat, ob der von mir verwendete XPath-Ausdruck gültig ist. Wenn nicht, wie lautet der gültige XPath-Ausdruck?

210
vcosk

Die Bedingung unten:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

überprüft, ob die Elementdaten in Element vorhanden sind, und nicht, ob die Elementwertdaten vorhanden sind.

Stattdessen können Sie verwenden

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
310
Rashmi Pandit
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

Der Grund, warum ich diese Antwort hinzufüge, ist, dass ich die Beziehung von . Und text() erklären möchte.

Bei der Verwendung von [] Gibt es zunächst nur zwei Arten von Daten:

  1. *[number], Um einen Knoten aus dem Knotensatz auszuwählen
  2. *[bool] Zum Filtern eines Knotensatzes aus einem Knotensatz

In diesem Fall wird der Wert von der Funktion boolean() als boolesch ausgewertet, und es gibt eine Regel:

Filter werden immer kontextbezogen ausgewertet.

Wenn Sie text() oder . Mit einem String "Data" Vergleichen müssen, wird zuerst die Funktion string() verwendet, um diese in einen String-Typ umzuwandeln, und dann wird ein boolesches Ergebnis erhalten .

Es gibt zwei wichtige Regeln für string():

  1. Die Funktion string() konvertiert eine Knotenmenge in eine Zeichenfolge, indem der Zeichenfolgenwert des ersten Knotens in der Knotenmenge zurückgegeben wird, was in einigen Fällen zu unerwarteten Ergebnissen führen kann.

    text() ist ein relativer Pfad, der einen Knotensatz zurückgibt, der den gesamten Textknoten des aktuellen Knotens (Kontextknotens) enthält, wie ["Data"]. Wenn es mit string(["Data"]) ausgewertet wird, gibt es den ersten Knoten der Knotenmenge zurück, sodass Sie nur dann "Daten" erhalten, wenn sich nur ein Textknoten in der Knotenmenge befindet.

  2. Wenn Sie möchten, dass die Funktion string() den gesamten untergeordneten Text verkettet, müssen Sie statt eines Knotensatzes einen einzelnen Knoten übergeben.

    Wenn wir zum Beispiel einen Knotensatz ['a', 'b'] Erhalten, können Sie diesen übergeordneten Knoten an string(parent) übergeben. Dies gibt 'ab' Zurück und natürlich string(.) in In Ihrem Fall wird eine verkettete Zeichenfolge "Data" zurückgegeben.

In beiden Fällen wird das gleiche Ergebnis nur dann erzielt, wenn ein Textknoten vorhanden ist.

19
宏杰李