不相干的XPath输出

时间:2016-04-27 08:54:12

标签: java xml xpath

我刚刚发现了XPath,我试图使用它来解析XML文件。我读了一些关于它的课程,但我遇到了一个问题。当我尝试从文件中获取NodeList时,getLength()方法始终返回0。 但是,当我尝试

document.getElementsByTagName("crtx:env").getLength()

输出正确(在我的情况下为7)。 我真的不明白,因为我的节点列表是根据我的文档构建的,输出应该是相似的,不是吗?

以下是我的代码的一部分:

    IFile                   f               = (IFile) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorInput().getAdapter(IFile.class);
    String                  fileURL         = f.getLocation().toOSString();
    DocumentBuilderFactory  builderFactory  = DocumentBuilderFactory.newInstance();
    DocumentBuilder         builder         = null;

    try {
        builder = builderFactory.newDocumentBuilder();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    }

    Document document = null;

    if (builder != null){
        try{
            document = builder.parse(fileURL);
            System.out.println("DOCUMENT URI : " + document.getDocumentURI());
        } catch (Exception e){
            e.printStackTrace();
        }
    } else {
        System.out.println("builder null");
    }


    XPath xPath =  XPathFactory.newInstance().newXPath();

    NodeList nodeList = null;

    try {
        nodeList = (NodeList) xPath.compile("crtx:env").evaluate(document, XPathConstants.NODESET);
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }

    System.out.println("NODELIST SIZE : " + nodeList.getLength());
    System.out.println(document.getElementsByTagName("crtx:env").getLength());

}

第一个System.out.println()返回相干输出(一个好的URI),但最后两行返回不同的数字。

任何帮助将不胜感激。 谢谢你的阅读。

1 个答案:

答案 0 :(得分:1)

为具有名称空间的XML定义了XPath,因此设置了

DocumentBuilderFactory  builderFactory  = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);

然后要使用带有命名空间前缀的路径,您需要使用https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPath.html#setNamespaceContext%28javax.xml.namespace.NamespaceContext%29来绑定用于命名空间URI的前缀,有关示例,请参阅https://xml.apache.org/xalan-j/xpath_apis.html#namespacecontext

使用名称空间感知DOM,您需要更改getElementsByTagName调用以使用getElementsByTagNameNS。