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