Why does Javax' XPath evaluate() method not return elements with non-breaking space when the selector uses the text() node test
Why does Javax' XPath evaluate() method not return elements with non-breaking space when the selector uses the text() node test
我有以下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> </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);
}
断言失败,因为 result
是 0
。但是,如果我使用 HTML,将其保存为 .htm
文件,并按预期在开发人员工具控制台 returns 中的 Chrome、$x("//tr/td/text()")
中打开它:
[text]
> 0: text
length: 1
> __proto__: Array(0)
我需要做什么才能在 Java 中获得相同的结果,即包含一项的节点列表?
DocumentBuilder 或某处的 XPath 对象上是否有 "ignore whitespace" 设置,或者是 Java 和 Chrome 的 JS 引擎不同意如何处理该特殊情况的根本原因白space字?
注意:删除 text()
(即文本节点选择)有效;然后 returns 正确的结果。用实际文本(例如 foo
)替换不间断的 space(
)也有效...
当禁用 dtd 加载时,Java 似乎无法识别
。
您的问题可以通过在 html 中为
编写一个实体来解决,例如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [ <!ENTITY nbsp " "> ]>
评估现在给出一个文本节点。
我有以下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> </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);
}
断言失败,因为 result
是 0
。但是,如果我使用 HTML,将其保存为 .htm
文件,并按预期在开发人员工具控制台 returns 中的 Chrome、$x("//tr/td/text()")
中打开它:
[text]
> 0: text
length: 1
> __proto__: Array(0)
我需要做什么才能在 Java 中获得相同的结果,即包含一项的节点列表?
DocumentBuilder 或某处的 XPath 对象上是否有 "ignore whitespace" 设置,或者是 Java 和 Chrome 的 JS 引擎不同意如何处理该特殊情况的根本原因白space字?
注意:删除 text()
(即文本节点选择)有效;然后 returns 正确的结果。用实际文本(例如 foo
)替换不间断的 space(
)也有效...
当禁用 dtd 加载时,Java 似乎无法识别
。
您的问题可以通过在 html 中为
编写一个实体来解决,例如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [ <!ENTITY nbsp " "> ]>
评估现在给出一个文本节点。