2014-10-07 3 views
0

У меня есть HTML-файл, и я хочу получить от него текст. Я решил использовать Jsoup, но у меня есть одна проблема. Я хочу перебирать текст тега один за другим.Jsoup Заменить теги с разделителем без рекурсии

Аналогичный вопрос: Jsoup Parsing adding delimiter с «рекурсивным» ответом. Я не хочу реализовывать рекурсивное решение из-за проблем с памятью.

Мой вопрос в том, что Jsoup имеет встроенную функцию, чтобы дать мне чистый текст с заранее определенным разделителем вместо тегов или есть какой-либо метод, который я могу повторять по элементу (элемент не имеет дочернего элемента) без рекурсивного решение?

+0

Не могли бы вы привести пример того, что вы хотите достичь? – alkis

ответ

0

Вы, скорее всего, хотели бы использовать потоковый парсер, например TagSoup, который реализует API SAX2. Так как он не создает дерево 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(); 
    } 
} 
+0

Использует ли ваш пример теги? – kamaci

+0

@kamaci Да, я добавил 'import's в список, чтобы сделать его более понятным. –

Смежные вопросы