XPath для вибору елемента за значенням атрибута


195

У мене є наступний 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>

Я хочу вибрати елемент Співробітник з id = "4".

Я використовую вираз XPath, який нічого не повертає.

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

Я перевірив це на http://chris.photobooks.com/xml/default.htm, і він говорить про недійсний xpath, не впевнений, де проблема.

Відповіді:


278

Ви повинні видалити /до [. Предикати (частини в [ ]) не повинні мати косої риски безпосередньо перед ними. Крім того, щоб вибрати сам елемент Співробітник, слід залишити його /text()в кінці, інакше ви просто будете вибирати текстові значення пробілу безпосередньо під елементом Співробітник.

//Employee[@id='4']

Редагувати: Як в коментарях зазначає Єнс, це //може бути дуже повільним, оскільки він шукає весь документ для відповідності вузлів. Якщо структура документів, з якими ви працюєте, буде узгодженою, вам, мабуть, найкраще використовувати повний шлях, наприклад:

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

3
Зауважте, що //вибирає та здійснює пошук у всіх вузлах документа, які можуть бути повільними. Натомість, якщо структура документа відома, тоді використовуйте правильний шлях, як пропонується у відповіді Гілла нижче.
Єнс

@Jens Так, це абсолютно правда. Я відредагував свою відповідь, щоб додати доповнення.
JLRishe

13

У подальшому ви можете вибрати "всі вузли з певним атрибутом" на зразок цього:

//*[@id='4']

12

Спробуйте зробити це:

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

чи xmllint завантажує весь файл XML в пам'ять, перш ніж шукати ідентифікатори ?. У мене є XML-файл розміром 46 Гб, і я шукаю в ньому ідентифікатори
Hani Goc

XML-файл розміром 46 Гб - проблема.
Гурвіндер Сінгх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.