23 Stimmen

XPATH-Mehrfachelement-Filter

Ich habe die folgende XML-Beispielstruktur:

<SavingAccounts>
    <SavingAccount>
       <ServiceOnline>yes</ServiceOnline>
       <ServiceViaPhone>no</ServiceViaPhone>
    </SavingAccount>
    <SavingAccount>
       <ServiceOnline>no</ServiceOnline>
       <ServiceViaPhone>yes</ServiceViaPhone>
    </SavingAccount>
</SavingAccounts>

Ich muss die "SavingAccount"-Knoten mit XPATH filtern, wenn der Wert von "ServiceOnline" "yes" oder der Wert von "ServiceViaPhone" "yes" ist.

Der XPATH sollte mir zwei Zeilen liefern!! Ich kann "SavingAccount"-Knoten filtern, bei denen beide Elementwerte "ja" sind, wie im folgenden XPATH-Beispiel, aber was ich tun möchte, ist ein Vergleich der Elementwerte "oder"?

/SavingAccounts/SavingAccount/ServiceOnline[text()='yes']/../ServiceViaPhone[text()='yes']/..

64voto

Dimitre Novatchev Punkte 234995

Dies ist eine sehr grundlegende XPath-Funktion: das Zusammenstellen einer Reihe von Bedingungen mit den logischen Operatoren and , or und die Funktion not() .

and hat eine höhere Priorität als or und beide Betreiber haben eine niedrigere Priorität als der relationale y Gleichstellung Betreiber ( = , != , > , >= , &lt; y &lt;= ).

Es ist also sicher zu schreiben : A = B and C = D

Einige der am häufigsten gemachten Fehler :

  1. Menschen schreiben AND und/oder OR . Denken Sie daran, dass bei XPath zwischen Groß- und Kleinschreibung unterschieden wird. .

  2. Die Menschen nutzen die | (Vereinigungs-)Operator anstelle von or

Abschließend möchte ich noch auf meine Lösung eingehen :

/SavingAccounts/SavingAccount [ServiceOnLine='yes' or ServiceViaPhone='yes']

10voto

AnthonyWJones Punkte 182582
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]

4voto

falstro Punkte 32879

Will

/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes']

den Zweck erfüllen?

Ich habe im Moment keinen XPath-Evaluator zur Hand.

EDIT :
Wenn ich mich richtig erinnere, brauchen Sie den Text() nicht, also

[ServiceOnline='yes' or ServiceViaPhone='yes']

sollte ausreichen und besser lesbar sein.

EDIT :
Ja, natürlich, "oder" für Prädikatsausdrücke, mein Fehler.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X