wake-up-neo.com

Wie verwende ich nicht enthält () in xpath?

Ich habe ein XML, das folgendermaßen strukturiert ist:

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>

Und ich muss jede Produktion mit einer Kategorie auswählen, die nicht "Business" enthält (also nur die erste Produktion in diesem Beispiel).

Ist das mit xpath möglich? Ich habe versucht, in dieser Richtung zu arbeiten, habe aber nichts erreicht:

//production[not(contains(category,'business'))]
53
Jason

Bei XPath-Abfragen wird die Groß- und Kleinschreibung beachtet. Wenn ich mir Ihr Beispiel angesehen habe (was übrigens fantastisch ist, scheint niemand mehr Beispiele zu geben!), Kann ich das gewünschte Ergebnis erhalten, wenn Sie einfach "business" in "business" ändern.

//production[not(contains(category,'Business'))]

Ich habe dies getestet, indem ich die XML-Datei in Chrome geöffnet habe und die XPath-Abfragen mit den Developer-Tools ausgeführt habe. Daraufhin erhielt ich nur die Kategorie Film zurück.

98
Arran

Ich muss jede Produktion mit einer Kategorie auswählen, die nicht "Business" enthält.

Obwohl ich die Antwort von @ Arran als richtig eingestuft habe, würde ich auch Folgendes hinzufügen ..... Streng interpretiert, würde die Spezifikation des OP als implementiert

//production[category[not(contains(., 'Business'))]]

eher, als

//production[not(contains(category, 'Business'))]

Letztere wählt jede Produktion aus, deren first category-Kind nicht "Business" enthält. Die beiden XPath-Ausdrücke verhalten sich unterschiedlich, wenn eine production keine oder mehrere mehr category-Kinder hat.

In der Praxis macht es keinen Unterschied, solange jeder <production> genau ein <category>-Kind hat, wie in Ihrem kurzen XML-Beispiel. Ob Sie immer darauf zählen können, dass dies wahr ist oder nicht, hängt von verschiedenen Faktoren ab, beispielsweise davon, ob Sie über ein Schema verfügen, das diese Einschränkung erzwingt. Persönlich würde ich mich für die robustere Variante entscheiden, da dies nicht "viel kostet" ... vorausgesetzt, Ihre in der Frage angegebene Anforderung ist wirklich korrekt (im Gegensatz zu "Wählen Sie jede Produktion aus, die keine Kategorie hat." das enthält "Business" ').

25
LarsH

Sie können die Funktion not(expression) verwenden

not() ist eine Funktion in xpath (im Gegensatz zu einem Operator)

Beispiel:

//a[not(contains(@id, 'xx'))]

OR

expression != true()
1
Shubham Jain

Sollte // Produktion sein (enthält nicht (Kategorie, "Geschäft"))]

0
bace