Поиск части строки с помощью запроса XPath

#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 в.