2015-11-10 87 views
1

我已经构建了一个使用saxon-he的xpath组件从html文档中提取数据的方法。我为此使用了w3c dom对象模型。如何从java中的org.w3c.dom.Node获取html?

我已经创建了返回文本值(jsoupElement.text())的方法,类似像jsoup文本值方法:

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--

+1

在Java中,您可以使用LSSerializer或使用默认Transformer对子节点或节点本身进行序列化,但是它们会为您提供DOM树的XML序列化,而不是原始的XML或HTML。 –

+0

感谢您的回答。是否有可能使用另一个文档对象模型来获取原始html?我可以选择这些模型:http://www.saxonica.com/documentation/index.html#!xpath-api/jaxp-xpath/factory – whitenexx

+1

我不认为有任何方法可以从任何原始HTML树模型,它存储节点而不是标记。我对jsoup不熟悉,但是他们可能也会序列化它们的树,只有HTML,而不是XML,如果你调用该方法来给你内部的HTML。 Saxon作为XSLT 2处理器支持使用具有正确输出方法的XSLT样式表的HTML和XHTML序列化(即''或'')所以你可以使用带有样式表的Transformer根据需要设置方法。也许API也提供了一些方法。 –

回答

0

序列化W3C DOM Node的子节点与撒克逊为HTML,你可以使用默认Transformer,你的输出方式设置为html

public static String getInnerHTML(Node node) throws TransformerConfigurationException, TransformerException 
{ 
    StringWriter sw = new StringWriter(); 
    Result result = new StreamResult(sw); 
    TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl(); 
    Transformer proc = factory.newTransformer(); 
    proc.setOutputProperty(OutputKeys.METHOD, "html"); 
    for (int i = 0; i < node.getChildNodes().getLength(); i++) 
    { 
     proc.transform(new DOMSource(node.getChildNodes().item(i)), result); 
    } 
    return sw.toString(); 
} 

但正如所说,这是树的序列化,原始XML或HTML不存储在DOM树或Saxon树模型中,因此无法访问它。