Jsoup用分隔符替换标签而不递归

时间:2014-10-07 17:52:14

标签: java jsoup

我有一个HTML文件,我想从中获取文本。我决定使用Jsoup,但我有一个问题。我想逐个迭代标签的文本。

这是一个类似的问题:Jsoup Parsing adding delimiter带有“递归”答案。由于内存问题,我不想实现递归解决方案。

我的问题是Jsoup有一个内置函数来给我带有预定义分隔符而不是标签的干净文本,或者是否有任何方法我可以逐个元素地迭代(一个元素没有子元素)而没有递归解决方案?

1 个答案:

答案 0 :(得分:0)

您可能希望使用像TagSoup这样的流式解析器,它实现了SAX2 API。由于它不构建DOM树,因此无论源文档大小如何,它都需要相同的内存量。如果你以前没有处理过SAX,这里有一点tutorial

要简单地清理文本(插入点而不是打开和关闭标记),您可以使用以下代码段:

package com.example;

import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.IOException;
import java.io.InputStream;

public class MyHandler extends DefaultHandler {
    final static String SEPARATOR = ".";
    StringBuilder builder;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        builder.append(SEPARATOR);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        builder.append(SEPARATOR);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        builder.append(ch, start, length);
    }

    public String cleanHtml(InputStream inputStream) {
        builder = new StringBuilder();
        Parser parser = new Parser();
        parser.setContentHandler(this);
        try {
            parser.parse(new InputSource(inputStream));
        } catch (IOException | SAXException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }
}