Java将DOM对象转换为段落

时间:2015-07-06 14:21:23

标签: java xml dom sax

在java中是否有与python函数lmxl.sax.saxify [1]类似的函数来从DOM生成SAX事件并针对SAX ContentHandler触发它们。 主要目的是将DOM对象转换为段落列表。 给出这个html片段

<p> Here is a text! 
<ul><li>list1</li><li>list2</li></ul>
</p>

我想要的输出是:

  • 第1段:这是一个文字!
  • 第2段:list1
  • 第3段:list2

[1] http://lxml.de/api/lxml.sax-module.html#saxify

2 个答案:

答案 0 :(得分:0)

是的,您可以使用DOMSource和SAXResult运行转换,请参阅http://www.java2s.com/Code/Java/XML/GeneratingSAXParsingEventsbyTraversingaDOMDocument.htm

Source source = new DOMSource(doc);

URI uri = new File("infilename.xml").toURI();
source.setSystemId(uri.toString());

DefaultHandler handler = new MyHandler();
SAXResult result = new SAXResult(handler);
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(source, result);

但为什么不从DOM本身提取您想要的信息呢?

答案 1 :(得分:0)

如果要从DOM文档中检索所有文本节点(这是与原始文档不同的问题),那么Xpath是从DOM文档中搜索和提取数据的最简单(也是最有效)的方法

以下是您需要的代码:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("/path/example.html");
XPath xPath =  XPathFactory.newInstance().newXPath();
String pattern = "//*/text()"; // retrieve all text nodes in the doc
NodeList nl = (NodeList)xPath.compile(pattern)
        .evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength() ; i++) {
    Node n = nl.item(i);
    String text = n.getNodeValue().trim();
    // skip over whitespace-only text
    if (text != null && text.isEmpty() == false) {
        System.out.println(text);
    }
}