当前位置: 首页 > 知识库问答 >
问题:

Java XPath扫描文件以查找单词

彭博厚
2023-03-14

我正在构建一个应用程序,它将从用户那里提取一个单词,然后使用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文件。

<?xml version="1.0"?>
<Tutorials>
    <Tutorial tutId="01" type="java">
        <title>Guava</title>
        <description>Introduction to Guava</description>
        <date>04/04/2016</date>
        <author>GuavaAuthor</author>
    </Tutorial>
    <Tutorial tutId="02" type="java">
        <title>XML</title>
        <description>Introduction to XPath</description>
        <date>04/05/2016</date>
        <author>XMLAuthor</author>
    </Tutorial>
</Tutorials>

找到解决方案后,我丢失了找到的条目的正确显示,正如有人在注释“java”中指出的那样,我只想扫描文本字段,这样在添加以下代码并更改我的应用程序将查找的单词后,就再也找不到了,应用程序工作了

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

共有1个答案

华旭
2023-03-14

您的XPath正在搜索text()节点,但是java一词出现在@type属性中(该属性不是text()节点)。

如果您想在text()@*中搜索单词,那么您可以使用联合|运算符并检查其中一个/两个包含该单词:

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

但是您可能还需要扫描注释()处理指令(),因此可以在节点()上进行通用匹配,然后在谓词测试中进行匹配:

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

对于XPath 2.0或更高版本,您可以使用:

//node()[(.|@*)[contains(., 'java')]]
 类似资料:
  • 我想你可以告诉我,这真的只是打印同一行两次,一次删除一个小写e和另一个删除一个大写e。我正在寻找一种方法来合并这两个替换,然后让它替换并打印,如果它找到一个e或只是打印“所有是好的!”如果没有“E”。

  • 问题内容: 以编程方式检查PDF文件是否被完全扫描的最佳方法是什么?我确实可以使用iText和PDFBox。我可以检查pdf文件是否包含文本,并根据结果确定该文件是否为OCRed,但是此解决方案并非100%准确。我想知道是否还有另一种方法来解决这个问题。 如您所知,解决方案必须基于Java。 问题答案: 最好的选择是检查它是否包含文本,还查看它是否包含大的页面化图像或覆盖页面的大量平铺图像。如果您

  • 问题内容: 尽管我们已部署了最新的类,但我们正在使用的是旧版本的类。要扫描应用程序服务器所有子文件夹中的所有JAR文件,我们如何编写一个小的Shell脚本来打印出找到该特定类的JARS文件的文件名? 问题答案: 就像是: 您可以这样包装: 然后将在当前目录下找到的所有jar文件中搜索该类

  • 我正在做一个项目,其中包含一个模块来扫描pdf,从sd卡文档xls文件,并列出它们。我也想只列出文件夹。 因为我对android非常陌生。任何人都有实现这一目标的想法。 这是我的密码:

  • 我有一个在Apache Tomee上运行的Java EE6 Web应用程序。 我的应用程序定义了几个接口a、B和C。我有多个包含这些接口实现的.jar文件。每当客户端发出某个请求时,我的web应用程序就会使用CDI扫描这些实现,并注入所需的任何实现。 但是,我不想预先按名称配置所有这些implement.jar文件。我希望只配置一个文件夹位置,所有这些实现.jar文件都驻留在其中,并让CDI进行发

  • 我对的体验非常糟糕,因为我使用的是和。所以我不能做扫描仪的程序。我是新手,所以请帮助我,“找不到”。这是我到目前为止的代码。