Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Javax';当选择器使用text()节点测试时,XPath evaluate()方法不会返回带有不间断空格的元素_Java_Xpath_Javax - Fatal编程技术网

为什么Javax';当选择器使用text()节点测试时,XPath evaluate()方法不会返回带有不间断空格的元素

为什么Javax';当选择器使用text()节点测试时,XPath evaluate()方法不会返回带有不间断空格的元素,java,xpath,javax,Java,Xpath,Javax,我有以下Java代码 @Test public void notGettingNonBreakingSpace() throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

我有以下Java代码

    @Test
    public void notGettingNonBreakingSpace() throws ParserConfigurationException, IOException, SAXException, XPathExpressionException {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        String html = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \n" +
            "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" +
            "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
            "<body><table><tr><td>&nbsp;</td></tr></table></body>\n" +
            "</html>";

        Document document = documentBuilder.parse(new ByteArrayInputStream(html.getBytes()));
        XPath xpath = XPathFactory.newInstance().newXPath();
        int result = ((NodeList) xpath.evaluate("//tr/td/text()", document, XPathConstants.NODESET)).getLength();
        assertEquals(1, result);
    }
我需要做什么才能在Java中获得相同的结果,即一个包含一个项目的节点列表

DocumentBuilder或XPath对象上是否存在“忽略空白”设置,或者是Java和Chrome的JS引擎不同意如何处理该特殊空白字符的根本原因


注意:删除
文本()
(即文本节点选择)有效;然后返回正确的结果。用实际文本(例如,
foo
)替换不间断空格(
)也可以…

当dtd加载被禁用时,Java似乎无法识别

您的问题可以通过在html中为
编写一个实体来解决,如:


evaluate现在提供一个文本节点。

它是否因为禁用了加载外部DTD而无法识别
nbsp
实体,或者可能无法识别任何其他实体<代码>设置功能(“http://apache.org/xml/features/nonvalidating/load-external-dtd“,假)@基督教右派。因为您禁用了加载外部DTD,所以无法识别它。我编辑了我的答案。如果您启用它,它可以获得nbsp的实体信息,而不仅仅是nbsp它可以从dtd推断出的任何实体。NB:我们过去遇到过一个问题,它试图下载dtd,这是我们不想要的,因此关闭了验证…请参阅。如果不想使用外部dtd,则应将其保持禁用状态。但是为了使JavaXPath工作,请为
nbsp
包含一个实体。
[text]
> 0: text
  length: 1
> __proto__: Array(0)