2013-01-09 12 views
143

Mam następujące XML.XPath, aby wybrać element według wartości atrybutu

<?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 nie zwraca niczego.

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

Sprawdziłem to na http://chris.photobooks.com/xml/default.htm i mówi nieważne XPath, nie wiem gdzie jest problem.

Odpowiedz

215

Musisz usunąć przed [. Predykaty (części w []) nie powinny mieć ukośników bezpośrednio przed nimi. Ponadto, aby wybrać sam element Employee, powinieneś zostawić na końcu /text() lub w inny sposób wybrać wartości tekstowe spacji bezpośrednio pod elementem Employee.

//Employee[@id='4'] 

Edit: W Jens podkreśla w komentarzach, // może być bardzo powolny, ponieważ przeszukuje cały dokument dla dopasowania węzłów. Jeśli struktury dokumentów z którymi pracujesz będzie spójne, jesteś prawdopodobnie najlepiej wyłączyć za pomocą pełnej ścieżki, na przykład:

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

Zauważ, że ' // 'wybiera i przeszukuje * wszystkie * węzły dokumentu, które mogą być wolne. Zamiast tego, jeśli znana jest struktura dokumentu, użyj odpowiedniej ścieżki, jak sugerowano w [Odpowiedź Gilles'a] (http://stackoverflow.com/questions/14248063/xpath-to-select-element-by-attribute-value # 14248129) poniżej. – Jens

+0

@Jens Tak, to absolutna prawda. Zmieniłem moją odpowiedź, aby dodać aneks. – JLRishe

8

Spróbuj zrobić tak:

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

czy xmllint wczytuje cały plik xml do pamięci przed wyszukiwaniem identyfikatorów? Mam plik xml o wielkości 46 GB i szukam w nim identyfikatorów –

Powiązane problemy