#java #xml #xpath
#java #xml #xpath
Вопрос:
Я использую следующий запрос XPath для поиска имени автора книги и возвращаю название книги, когда оно совпадает с именем автора.
String rawXPath = String.format("//book[author= '%s']/bookname/text()", authorBook);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr
= xpath.compile(rawXPath);
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) resu<
for (int i = 0; i < nodes.getLength(); i ) {
System.out.println(nodes.item(i).getNodeValue());
}
как изменить поиск, чтобы я мог выполнять поиск в содержимом …../content (имя узла) для определенного слова.
Пример: Строка внутри переменной содержимого xml: «Эта книга содержит славу и историю наших предков. И влияние этого в нашей повседневной жизни огромно «.
Теперь я хочу выполнить поиск по слову «ежедневно». Если оно совпадает ежедневно, оно повторно настроит мне название книги / имя автора, какое захочет пользователь.
Спасибо
Комментарии:
1. Хороший вопрос, 1. Смотрите мой ответ для простого однострочного выражения XPath и для его объяснения.
Ответ №1:
Используйте contains()
функцию Xpath.
//book[contains(content, '%s')]/bookname
в зависимости от структуры вашего входного XML
Ответ №2:
Вы хотите:
//book[contains(content, $searchString)
and
author = $wantedAuthor
]
/bookname/text()
При этом выбираются text()
узлы, которые являются дочерними для bookname
элемента, который является дочерним для любого book
элемента в документе, строковое значение content
дочернего элемента которого содержит строку (содержащуюся в) $searchString
, а строковое значение author
элемента которого совпадает с (строкой, содержащейся в) $wantedAuthor
переменной
В этом выражении Xpath переменные должны быть заменены определенными строками. Кроме того, предполагается, что элемент content
является дочерним элементом book
.
Я не знаю Java, но предположим, что окончательный Java-код будет выглядеть следующим образом:
String.format("//book[contains(content, '%s')
and
author= '%s']/bookname/text()",
searchString, authorBook);
Ответ №3:
если ваш xml выглядит следующим образом:
<book>
<author> Author Name </author>
<description> This book contains the glory and history of our forefathers. And the impact of it in our daily life is immense.</description>
</book>
затем вы можете попробовать:
String rawXPath = "//book//*[contains(text(),"daily")]";
что означает «дайте любому элементу book, который содержит любой дочерний элемент, текст, содержащий слово «daily».
Я надеюсь, что это поможет вам! приветствия!
Ответ №4:
Теперь, если вы хотите также выполнить поиск по некоторому термину, который находится внутри одного узла, вы можете сделать это следующим образом —
String rawXPath = String.format("//book/title[contains(innerItem, '%s')]/type/text()", value);
Добавьте одну обратную косую черту для каждого узла, а также имя узла и ur в.