代码之家  ›  专栏  ›  技术社区  ›  Esko

Java中使用XPath时直接引用节点的问题

  •  2
  • Esko  · 技术社区  · 15 年前

    我最近碰到了一个问题,Java的原生XML API(W3C),它的核心是,如果我试图在文档中直接使用XPath表达式,比如说 //body xpath的计算结果为false (错误行为) 但是如果我把它换成 //*[1] 它的评价是真的 (理想行为) .

    我已经检查了很多次,并且使用了不同的文档,我使用的XML是有效的。( 我主要在这个系统的其余部分使用XHTML 2.0 )

    由于我不知道是什么导致了这一点,下面是我正在使用的各种工厂对象的配置选项集。

    如您所见,我有很多与整个问题相关的各种类的自定义实现,我认为这可能与问题有关,但我不确定,运行单元测试、使用调试器和大量的.println:s还没有帮助我。

    XPath:

    • xpathfactory.setXPathFunctionResolver(myFunctionResolver)
    • xpath.setNamespaceContext(myNamespaceContext);
    • xpath.setXPathVariableResolver(myResolver);

    文档生成器:

    (F==DocumentBuilderFactory)

    • f.f.setValidating(false);
    • f.setSchema(null);
    • f.setNamespaceAware(true);
    • f.setIgnoringComments(true);
    • f.setIgnoringElementContentWhitespace(true);
    • +特征 "http://xml.org/sax/features/validation" , "http://apache.org/xml/features/validation/schema" "http://apache.org/xml/features/nonvalidating/load-external-dtd" 作为 false

    (dc==documentbuilder)

    • dc.setEntityResolver(null);
    • dc.setErrorHandler(myErrorHandler);

    另外值得一提的是,我在WindowsXP上使用Sun Java 5。

    在这一点上,所有的想法都是受欢迎的,因为这个问题,我感到非常沮丧。

    结论

    这是一个名称空间问题,问题是我没有声明 违约 MyNamespaceContext中的命名空间!只是添加

    else {
        return "http://www.w3.org/1999/xhtml";
    }
    

    使其正常工作,现在我使其正常工作,以便检测到默认名称空间。真是魅力四射!这两个答案都帮助我找到了原因,如果可能的话,我会选择这两个答案作为首选答案。

    2 回复  |  直到 15 年前
        1
  •  4
  •   annakata    15 年前

    不熟悉Java,但这听起来像命名空间问题一样全世界-大概是默认的命名空间的文件和评估器是不同的。

    编辑:我们可以看到您的XML文档和代码吗?以及如何 //*[local-name()='body'] 回应?

        2
  •  3
  •   Brian Agnew    15 年前

    如果是XHTML,那么它会有一个 namespace 定义。你要么删除(不一定是可取的),要么限定你的表达,从而:

    //:body
    

    (注意符合上述条件的前导冒号) enter code here