Поиск части строки с использованием запроса XPath - PullRequest
2 голосов
/ 15 апреля 2011

Я использую следующий запрос 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) result;
for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getNodeValue()); 
}

как изменить поиск, чтобы я мог искать в контенте ..... / контенте (имя узла) конкретное слово.

Пример. Строка внутри переменной содержимого xml: «Эта книга содержит славу и историю наших предков. И влияние этого в нашей повседневной жизни огромно».

Теперь я хочу найти слово «ежедневно».Если он совпадает ежедневно, он вернет мне имя книги / имя автора независимо от того, что хочет пользователь.

Спасибо

Ответы [ 4 ]

2 голосов
/ 15 апреля 2011

Используйте функцию contains() Xpath.

//book[contains(content, '%s')]/bookname

в зависимости от структуры вашего ввода XML

1 голос
/ 16 апреля 2011

Вы хотите :

//book[contains(content, $searchString)
     and
       author = $wantedAuthor
      ]
       /bookname/text()

Это выбирает узлы text(), которые являются дочерними элементами для элемента bookname, который является дочерним для любого элемента book в документе, строковое значение которого content child содержит строку (содержится в) $searchString и строковое значение элемента author которого совпадает с (строка, содержащаяся в) $wantedAuthor переменная

В этом выражении Xpath переменные должны быть заменены конкретными строками. Также предполагается, что элемент content является потомком book.

Я не знаю Java, но предположим, что окончательный код Java будет выглядеть следующим образом:

String.format("//book[contains(content, '%s') 
                    and 
                     author= '%s']/bookname/text()", 
              searchString, authorBook);   
0 голосов
/ 17 апреля 2011

Теперь, если вы хотите найти также некоторый термин, который находится внутри одного узла, вы можете сделать это следующим образом -

String rawXPath = String.format("//book/title[contains(innerItem, '%s')]/type/text()", value);

Добавьте одну обратную косую черту для каждого узла, а также имя узла и ur in.

0 голосов
/ 15 апреля 2011

если ваш 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\")]";

, что означает «дать любому элементу книги, что любой дочерний элемент содержит текст, содержащий слово'daily'.

Надеюсь, это поможет вам! Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...