Ich versuche zu verstehen und XPath, das mir für die Verwendung mit ACORD XML-Formularen (allgemeines Format in der Versicherung) gesendet wurde. Der XPath, den sie mir gesendet haben, ist (aus Platzgründen verkürzt):
%Vor% Wo ich Probleme habe, ist, dass Pythons lxml
-Bibliothek mir sagt, dass [InsuredOrPrincipalInfo/InsuredOrPrincipalRoleCd="AN"]
ein invalid predicate
ist. Ich bin nicht in der Lage, irgendwo in der XPath-Spezifikation auf Prädikaten zu finden, die diese Syntax identifiziert, damit ich kann dieses Prädikat ändern, um zu funktionieren.
Gibt es eine Dokumentation darüber, was genau dieses Prädikat auswählt? Ist das sogar ein gültiges Prädikat, oder wurde irgendwo etwas gemangelt?
Möglicherweise verwandt:
Ich glaube, die Firma, mit der ich arbeite, ist ein MS-Shop, also kann dieser XPath in C # oder einer anderen Sprache in diesem Stapel gültig sein? Ich bin mir nicht ganz sicher.
Aktualisierungen:
Pro Kommentar Nachfrage, hier ist ein paar zusätzliche Informationen.
XML-Beispiel:
%Vor%Codebeispiel (mit vollständigem XPath statt Snippet):
%Vor% Ändern Sie tree.find
in tree.xpath
. find
und findall
sind in lxml vorhanden, um die Kompatibilität mit anderen Implementierungen von ElementTree zu gewährleisten. Diese Methoden implementieren nicht die gesamte XPath-Sprache . Um XPath-Ausdrücke mit erweiterten Funktionen zu verwenden, verwenden Sie die Methode xpath
, die Klasse XPath
oder XPathEvaluator
.
Zum Beispiel:
%Vor%ergibt
%Vor% während tree.find
ergibt
Einige Probleme mit diesem Ausdruck :
Die Endung /
-Zeichen macht syntaktisch ungültig . Es markiert den Beginn eines neuen Standortschritts, aber es folgt nichts.
Wie Dr. Michael Kay bemerkt hat, haben Sie möglicherweise Probleme mit verschachtelten Zitaten in Python.
Lösungsvorschlag :
%Vor% In diesem Ausdruck werden doppelte Anführungszeichen durch einfache Anführungszeichen ersetzt. Die zweite Änderung ist das Entfernen der Endung /
.
Update : Das OP hat jetzt ein vollständigeres Codebeispiel bereitgestellt, und ich kann überprüfen, ob der verwendete XPath-Ausdruck falsch ist. Unten ist seine Überprüfung mit XSLT:
%Vor%, wenn diese Transformation auf das bereitgestellte XML-Dokument angewandt wird :
%Vor%das gewünschte, korrekte Ergebnis wird erzeugt :
%Vor%Fazit : Das Problem liegt entweder im Python-Code, oder (weniger wahrscheinlich) die verwendete XPath-Engine hat einen Fehler.
Der XPath, den Sie erhalten haben, ist vollkommen korrekt. Vielleicht ist das Problem bei der Einbettung in Python aufgetreten, wo Sie Python-Escape-Konventionen verwenden müssen, um die doppelten Anführungszeichen in einer Zeichenfolge zu umgehen?