Как я могу использовать XPath для выбора XML-узла на основе его содержимого?
Если я, например, есть следующий xml, и я хочу выбрать
<books>
<book isbn='0131103628'>
<title>The C Programming Language</title>
<authors>
<author>Ritchie, Dennis M.</author>
<author>Kernighan, Brian W.</author>
</authors>
</book>
<book isbn='1590593898'>
<title>Joel on Software</title>
<authors>
<author>Spolsky, Joel</author>
</authors>
</book>
</books>





XPath для этого:
/books/book/authors/author[contains(., 'Ritchie')]
В C# следующий код вернет «Ritchie, Dennis M.»:
xmlDoc.SelectSingleNode("/books/book/authors/author[contains(., 'Ritchie')]").InnerText;
//author[contains(text(), 'Ritchie')]
/books/book/authors/author[contains(., 'Ritchie')]
или же
//author[contains(., 'Ritchie')]
где я могу прочитать полный и понятный справочник по этим функциям?
@Oliver - Это упоминание text() меня сильно смутило. Это неверно. . - это просто текущий элемент.
@NicolasBarbulesco - Спасибо за ваш комментарий и ссылку на пример. В самом конце страницы также пишут это: Всякий раз, когда вам нужно выбрать элемент и использовать предикат для этого же элемента, вам нужно будет использовать точку "." для доступа к значение этого элемента. Так что да, мое упоминание text () было неправильным. Согласно w3.org: . выбирает контекстный узел, а text () выбирает все текстовые узлы-потомки контекстного узла. И даже больше примеров с использованием text ().
Это не работает, когда целевой текст состоит из нескольких строк.
Для новичков XPath, таких как я, может быть полезно отметить, что
.- это более короткий псевдонимtext()- так что да, этот ответ делает правильные вещи.