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>

Я хочу выбрать элемент Employee с id = "4".

Я использую ниже XPath выражение, которое ничего не возвращает.

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

Я проверил это на http://chris.photobooks.com/xml/default.htm, и там написано, что неверный xpath, не уверен, в чем проблема.

Панкай
источник

Ответы:

278

Вы должны удалить /до [. У предикатов (частей [ ]) не должно быть косых черт непосредственно перед ними. Кроме того, чтобы выбрать сам элемент Employee, вы должны /text()не указывать в конце, иначе вы просто выбираете текстовые значения пробелов непосредственно под элементом Employee.

//Employee[@id='4']

Редактировать: как указывает Дженс в комментариях, это //может быть очень медленно, потому что он ищет во всем документе соответствующие узлы. Если структура документов, с которыми вы работаете, будет согласованной, лучше всего использовать полный путь, например:

/Employees/Employee[@id='4']
JLRishe
источник
3
Обратите внимание, что //выбор и поиск по всем узлам документа может быть медленным. Вместо этого, если структура документа известна, используйте правильный путь, как предложено в ответе Жиля ниже.
Йенс
@Jens Да, это абсолютно верно. Я отредактировал свой ответ, чтобы добавить приложение.
JLRishe
13

Как следствие, вы можете выбрать «все узлы с определенным атрибутом» следующим образом:

//*[@id='4']
rogerdpack
источник
12

Попробуйте сделать это:

/Employees/Employee[@id=4]/*/text()
Жиль Квено
источник
xmllint загружает весь XML-файл в память перед поиском идентификаторов? У меня есть xml-файл размером 46 ГБ, и я ищу в нем идентификаторы
Хани Гок
xml файл 46 гб - есть проблема.
Гурвиндер Сингх