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

133

У меня есть 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, не уверен, в чем проблема.

Теги:
xpath

2 ответа

194
Лучший ответ

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

//Employee[@id='4']

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню