XPath, um Element nach Attributwert auszuwählen

193

Ich habe folgendes XML.

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee>
    <Employee id="4">
        <age>25</age>
        <name>Meghna</name>
        <gender>Female</gender>
        <role>Manager</role>
    </Employee>
</Employees>

Ich möchte das Employee-Element mit der ID = "4" auswählen.

Ich verwende den folgenden XPath-Ausdruck, der nichts zurückgibt.

//Employee/[@id='4']/text()

Ich habe es unter http://chris.photobooks.com/xml/default.htm überprüft und es heißt ungültiger xpath, nicht sicher, wo das Problem liegt.

Pankaj
quelle

Antworten:

274

Sie müssen das /vor dem entfernen [. Prädikate (die Teile in [ ]) sollten nicht unmittelbar vor ihnen Schrägstriche haben. Um das Employee-Element selbst auszuwählen, sollten Sie das /text()am Ende weglassen. Andernfalls wählen Sie einfach die Leerzeichen-Textwerte direkt unter dem Employee-Element aus.

//Employee[@id='4']

Bearbeiten: Wie Jens in den Kommentaren hervorhebt, //kann dies sehr langsam sein, da das gesamte Dokument nach übereinstimmenden Knoten durchsucht wird. Wenn die Struktur der Dokumente, mit denen Sie arbeiten, konsistent sein soll, verwenden Sie wahrscheinlich am besten einen vollständigen Pfad, zum Beispiel:

/Employees/Employee[@id='4']
JLRishe
quelle
3
Beachten Sie, dass alle Knoten des Dokuments ausgewählt //und durchsucht werden, die langsam sein können. Wenn die Struktur des Dokuments bekannt ist, verwenden Sie stattdessen einen geeigneten Pfad, wie in Gilles 'Antwort unten vorgeschlagen.
Jens
@Jens Ja, das ist absolut wahr. Ich habe meine Antwort bearbeitet, um einen Nachtrag hinzuzufügen.
JLRishe
12

Versuchen Sie Folgendes:

/Employees/Employee[@id=4]/*/text()
Gilles Quenot
quelle
Lädt xmllint die gesamte XML-Datei in den Speicher, bevor nach den IDs gesucht wird? Ich habe eine XML-Datei von 46 GB und ich suche nach IDs darin
Hani Goc
XML-Datei von 46 GB - es gibt das Problem.
Gurwinder Singh
12

Im Anschluss können Sie "alle Knoten mit einem bestimmten Attribut" wie folgt auswählen:

//*[@id='4']
Rogerdpack
quelle