【发布时间】:2016-02-11 15:35:38
【问题描述】:
我已经构建了一个使用 saxon-he 的 xpath 组件从 html 文档中提取数据的方法。我正在为此使用 w3c dom 对象模型。
我已经创建了一个返回文本值的方法,类似于来自 jsoup (jsoupElement.text()) 的文本值方法:
protected String getNodeValue(Node node) {
NodeList childNodes = node.getChildNodes();
for (int x = 0; x < childNodes.getLength(); x++) {
Node data = childNodes.item(x);
if (data.getNodeType() == Node.TEXT_NODE)
return data.getNodeValue();
}
return "";
}
这工作正常,但我现在需要一个选定节点的底层 html(使用 jsoup 它将是 jsoupElement.html())。使用 w3c dom 对象模型我有 org.w3c.dom.Node。如何从 org.w3c.dom.Node 获取 html 作为字符串?我在文档中找不到与此相关的任何内容。
只是为了澄清:我需要将内部 html(带或不带节点元素/标签)作为字符串。类似http://api.jquery.com/html/ 或http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#html--
【问题讨论】:
-
在 Java 中,您可以使用 LSSerializer 或使用默认的 Transformer 序列化子节点或节点本身,但是它们将为您提供 DOM 树的 XML 序列化,而不是原始 XML 或 HTML。
-
感谢您的回答。是否可以使用另一个文档对象模型获取原始 html?我可以在这些模型之间进行选择:saxonica.com/documentation/index.html#!xpath-api/jaxp-xpath/…
-
我不认为有任何方法可以从任何树模型中获取原始 HTML,它存储节点而不是标记。我对 jsoup 不熟悉,但如果您调用该方法来为您提供内部 HTML,他们也可能会序列化他们的树,只序列化为 HTML,而不是 XML。 Saxon 作为 XSLT 2 处理器支持 HTML 和 XHTML 序列化,其中 XSLT 样式表具有正确的输出方法(即
<xsl:output method="html"/>或<xsl:output method="xhtml"/>),因此您可以使用带有样式表的 Transformer,根据需要设置方法。也许 API 也提供了一些方法。 -
我不能使用序列化的 html 输出,因为它可能与原始 html 不同,并且进一步的提取过程(正则表达式)可能与序列化的 html 不匹配。所以我必须寻找另一种解决方案或改变我进行提取的方式。非常感谢!
-
“原始 HTML”根本不存在被提取:它只能被重构,并且总会有微小的变化,例如重新排序属性。