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.

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']

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()

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']
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.