#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')]]