XPath, aby wybrać element według wartości atrybutu


195

Mam następujące 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>

Chcę wybrać element pracownika o id = „4”.

Używam poniżej wyrażenia XPath, które niczego nie zwraca.

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

Sprawdziłem to na stronie http://chris.photobooks.com/xml/default.htm i podałem nieprawidłową ścieżkę xpath, nie jestem pewien, gdzie jest problem.

Odpowiedzi:


278

Musisz usunąć /przed [. Predykaty (części w [ ]) nie powinny mieć ukośników bezpośrednio przed nimi. Ponadto, aby wybrać sam element Employee, należy zrezygnować z opcji /text()na końcu, w przeciwnym razie należy po prostu wybrać wartości białych znaków bezpośrednio w elemencie Employee.

//Employee[@id='4']

Edycja: jak Jens wskazuje w komentarzach, //może być bardzo powolny, ponieważ przeszukuje cały dokument w poszukiwaniu pasujących węzłów. Jeśli struktura dokumentów, z którymi pracujesz, będzie spójna, prawdopodobnie najlepiej będzie użyć pełnej ścieżki, na przykład:

/Employees/Employee[@id='4']

3
Zauważ, że //wybiera i przeszukuje wszystkie węzły dokumentu, które mogą być wolne. Zamiast tego, jeśli struktura dokumentu jest znana, zastosuj właściwą ścieżkę, jak zasugerowano w odpowiedzi Gilles poniżej.
Jens

@Jens Tak, to absolutna prawda. Zredagowałem swoją odpowiedź, aby dodać załącznik.
JLRishe 26.04.16

13

W dalszej kolejności możesz wybrać „wszystkie węzły z określonym atrybutem” w następujący sposób:

//*[@id='4']

12

Spróbuj to zrobić:

/Employees/Employee[@id=4]/*/text()

czy xmllint ładuje cały plik xml do pamięci przed wyszukaniem identyfikatorów ?. Mam plik xml o pojemności 46 GB i szukam w nim identyfikatorów
Hani Goc

plik xml 46 GB - problem.
Gurwinder Singh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.