2012-06-13 5 views
42

Ich habe einige XML, die wie folgt strukturiert:Wie zu verwenden, enthält nicht() in XPath?

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

Und ich brauche jede Produktion mit einer Kategorie zu wählen, die nicht „Business“ enthalten (also nur die erste Produktion in diesem Beispiel).

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

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

Antwort

79

XPath Abfragen sind Groß-und Kleinschreibung. Nachdem bei Ihrem Beispiel sah (was, nebenbei bemerkt, ist genial, niemand scheint mehr Beispiele zu liefern!), Ich das Ergebnis bekommen Sie nur durch Ändern „Geschäft“ wollen, „Business“

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

I Ich habe dies getestet, indem ich die XML-Datei in Chrome geöffnet habe und mit den Entwicklertools diese XPath-Abfragen ausgeführt habe, und es gab mir nur die Filmkategorie zurück.

24

Ich brauche jede Produktion mit einer Kategorie zu wählen, die nicht „Business“

Obwohl ich die richtige upvoted @ Arran Antwort enthält, ich würde das auch hinzufügen ... streng interpretiert, der Spezifikation des OP würde als

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

statt

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

Letzteres wählt jede Produktion aus, deren erstescategory Kind "Business" nicht enthält. Die zwei XPath-Ausdrücke verhalten sich anders, wenn ein production keine category untergeordneten Elemente oder mehr als eins hat.

Es macht keinen Unterschied in der Praxis, solange jede <production> hat genau eine <category> Kind, wie in Ihrem kurzen Beispiel XML. Ob Sie sich immer darauf verlassen können, dass das wahr ist oder nicht, hängt von verschiedenen Faktoren ab, beispielsweise davon, ob Sie ein Schema haben, das diese Einschränkung erzwingt. Persönlich würde ich für die robustere Option gehen, da es nicht viel "kostet" ... vorausgesetzt, Ihre Anforderung, wie in der Frage angegeben, ist wirklich richtig (im Gegensatz zu zB "wählen Sie jede Produktion aus, die keine Kategorie hat das enthält "Geschäft").

+0

@LoamyHound: Danke für die Korrektur! Endlich habe ich deine Antwort gesehen und über 2 Jahre später die fehlende Halterung repariert. – LarsH

1

können Sie verwenden not(expression) Funktion

not() eine Funktion in XPath ist (im Gegensatz zu einem Bediener gegen)

Beispiel:

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

ODER

expression != true()