2016-04-15 13 views
1

Ich versuche, ein XML-Dokument von Jobs nach dem Firmennamen zu filtern.Filtern nach mehreren Werten mit XPath

Ich bin in der Lage alle Einzelteile zu ziehen, deren Namen bestimmte Unternehmen mit entsprechen:

doc.xpath("/source/job[company[text() = 'BigCorp' or text() = 'MegaCorp']]") 

Ich bin nicht in der Lage zu tun das Gegenteil und ausschließen, indem diese Werte, mit so etwas wie:

doc.xpath("/source/job[company[text() != 'Hodes' or text() != 'Scurri']]") 

Wo gehe ich falsch? Gibt es eine Möglichkeit, eine durch Kommas getrennte Liste von Werten bereitzustellen?

+0

Kurz gesagt: https://en.m.wikipedia.org/wiki/De_Morgan%27s_laws – Phrogz

+0

Willkommen bei Stack Overflow. Wenn wir fragen, benötigen wir die minimalen Eingabedaten, die notwendig sind, um das Problem zusammen mit der erwarteten Ausgabe zu demonstrieren. Bitte lesen Sie "[fragen]" und "[mcve]". –

Antwort

3

versuchen, die or-and Wechsel:

doc.xpath("/source/job[company[text() != 'Hodes' and text() != 'Scurri']]") 

Wenn Sie or, es ist immer geht die Arbeit zurückzukehren.

Zum Beispiel würde es den Job mit der Firma Hodes zurückgeben, weil text() != 'Scurri' wahr ist (und umgekehrt).


In Bezug auf den folgenden Kommentar:

so tat normalize-space() es! doc.xpath("/source/job[company[normalize-space() != 'Hodes' and normalize-space() != 'Scurri']]") nicht sicher warum?

Der Grund normalize-space() funktioniert, weil text() auch Whitespace zurückgibt.

Zum Beispiel, wenn Sie ein Element wie haben:

<company> 
Hodes 
</company> 

oder:

<company> Hodes </company> 

die text() entspräche "_Hodes_". (I ersetzt die Räume mit _, um sie leichter zu sehen, zu machen.)

Wegen der Leerzeichen, „_Hodes_“ ist nicht gleich „Hodes“.

Mit normalize-space() wird der führende/nachfolgende Leerzeichen entfernt und mehrere Leerzeichen durch ein einzelnes Leerzeichen ersetzt.

+0

Danke - Ich habe es versucht, aber es gibt immer noch diese Firmen 'doc = doc.xpath ("/source/job [company [text()! = 'Hodes' und text()! = 'Scurri']] ") – cman77

+0

@ cman77 - Können Sie Ihrer Frage ein minimales Beispiel hinzufügen? Versuchen Sie vielleicht auch, 'text()' durch 'normalize-space()' zu ersetzen. –

+0

so 'normalize-space()' hat es geschafft! 'doc.xpath ("/source/job [Firma [normalize-space()! = 'Hodes' und normalize-space()! = 'Scurri']] ")' nicht sicher warum? – cman77

Verwandte Themen