Файл сканирования Java XPath в поисках слова

#java #xpath

#Ява #xpath

Вопрос:

Я создаю приложение, которое будет принимать слово от пользователя, а затем сканировать файл с помощью XPath, возвращая значение true или false в зависимости от того, было ли слово найдено в этом файле или нет.

У меня есть следующий класс, реализующий XPath, но я либо неправильно понимаю, как он должен работать, либо что-то не так с моим кодом. Может ли кто-нибудь объяснить мне, как использовать Xpath для полного поиска файлов?

 public XPath() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException {  FileInputStream fileIS = new FileInputStream("text.xml");  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = builderFactory.newDocumentBuilder();  Document xmlDocument = builder.parse(fileIS);  XPathFactory xPathfactory = XPathFactory.newInstance();  javax.xml.xpath.XPath xPath = xPathfactory.newXPath();  XPathExpression expr = xPath.compile("//text()[contains(.,'java')]");  System.out.println(expr.evaluate(xmlDocument, XPathConstants.NODESET));  }  

И xml-файл, который я сейчас тестирую.

 lt;?xml version="1.0"?gt; lt;Tutorialsgt;  lt;Tutorial tutId="01" type="java"gt;  lt;titlegt;Guavalt;/titlegt;  lt;descriptiongt;Introduction to Guavalt;/descriptiongt;  lt;dategt;04/04/2016lt;/dategt;  lt;authorgt;GuavaAuthorlt;/authorgt;  lt;/Tutorialgt;  lt;Tutorial tutId="02" type="java"gt;  lt;titlegt;XMLlt;/titlegt;  lt;descriptiongt;Introduction to XPathlt;/descriptiongt;  lt;dategt;04/05/2016lt;/dategt;  lt;authorgt;XMLAuthorlt;/authorgt;  lt;/Tutorialgt; lt;/Tutorialsgt;  

Нашел решение, мне не хватало правильного отображения найденных записей, и, как кто-то указал в комментарии, «java» находится в аргументах, и я хочу сканировать только текстовые поля, чтобы они никогда не были найдены, после добавления следующего кода и изменения слова, которое будет искать мое приложение, приложение работает

 Object result = expr.evaluate(xmlDocument, XPathConstants.NODESET);  NodeList nodes = (NodeList) result;  for (int i = 0; i lt; nodes.getLength(); i  ) {  System.out.println(nodes.item(i).getNodeValue());  }  

Комментарии:

1. Пожалуйста, объясните цель вашего поиска. В настоящее время вы выполняете поиск только в текстовых узлах. Но в вашем примере XML слово «java» содержится только в атрибутах. Если вас не интересует структура XML, вы можете рассматривать XML как обычный текст и выполнять простой текстовый поиск. Затем вы найдете имена элементов, содержащие «java», а также комментарии. Но это зависит от вашего варианта использования.

Ответ №1:

Ваш XPath выполняет поиск text() узлов, но java в @type атрибуте появляется слово (которое не является text() узлом).

Если вы хотите найти слово в обоих text() , а @* затем вы можете использовать | оператор объединения и проверить, содержит ли одно или оба слова это слово:

 //text()[contains(. ,'java')] | //@*[contains(., 'java')]  

Но вы также можете захотеть просканировать comment() и processing-instruction() , таким образом, в целом сопоставить node() , а затем в тесте предикатов:

 //node()[contains(. ,'java')] | //@*[contains(., 'java')]  

С XPath 2.0 или выше вы можете использовать:

 //node()[(.|@*)[contains(., 'java')]]