Извлечение текста от Java HTML

Я использовал интерфейсы время от времени, и вот мое последнее использование (имена были обобщены):

у меня есть набор пользовательских элементов управления на WinForm, который должен сохранить данные к моему бизнес-объекту. Один подход должен назвать каждое управление отдельно:

myBusinessObject.Save(controlA.Data);
myBusinessObject.Save(controlB.Data);
myBusinessObject.Save(controlC.Data);

проблема с этой реализацией состоит в том, что любое время, я добавляю управление, в которое я должен войти мой, "Сохраняют Данные" метод и добавляют новое управление.

я изменил свои средства управления для реализации интерфейса ISaveable, который имеет метод, SaveToBusinessObject (...) поэтому теперь мой "Сохраняют Данные" метод, просто выполняет итерации посредством средств управления и если это находит тот, который является ISaveable, это называет SaveToBusinessObject. Таким образом, теперь то, когда новое управление необходимо, все, что кто-то должен сделать, реализовать ISaveable в том объекте (и никогда не касаться другого класса).

foreach(Control c in Controls)
{
  ISaveable s = c as ISaveable;

  if( s != null )
      s.SaveToBusinessObject(myBusinessObject);
}

часто неосуществленное преимущество для интерфейсов - то, что Вы локализуете модификации. После того, как определенный, Вы будете редко изменять полный поток приложения, но Вы будете часто вносить изменения на уровне детализации. Когда Вы сохраните детали в конкретных объектах, изменение в ProcessA не будет влиять на изменение в ProcessB. (Базовые классы также приносят Вам эту пользу.)

РЕДАКТИРОВАНИЕ: Другое преимущество является спецификой в действиях. Как в моем примере, все, что я хочу сделать, сохраняют данные; я не забочусь, какое управление это или если это может сделать что-либо еще - я просто хочу знать, могу ли я сохранить данные в управлении. Это делает мой код сохранения довольно ясным - нет никаких проверок, чтобы видеть, является ли это текст, числовой, булев или безотносительно потому что пользовательский элемент управления обрабатывает все это.

17
задан Reinstate Monica 12 March 2013 в 15:05
поделиться

6 ответов

jericho - один из нескольких возможных синтаксических анализаторов HTML. это может сделать эту задачу простой и безопасной.

9
ответ дан 30 November 2019 в 11:52
поделиться

JTidy может представлять HTML-документ (даже уродливый) как модель документа, что делает процесс извлечения содержимого тега

более элегантным процессом, чем ручное преобразование через необработанный текст.

4
ответ дан 30 November 2019 в 11:52
поделиться

Попробуйте (если вы не хотите использовать библиотеку парсера HTML):


        FileReader fileReader = new FileReader(file);
        BufferedReader buffRd = new BufferedReader(fileReader);
        BufferedWriter out = new BufferedWriter(new FileWriter(newFile.txt));
        String s;
        int writeTo = 0;
        while ((s = br.readLine()) !=null) 
        {
                if(s.contains("<p>"))
                {
                        writeTo = 1;

                        try 
                        {
                            out.write(s);
                    } 
                        catch (IOException e) 
                        {

                    }
                }
                if(s.contains("</p>"))
                {
                        writeTo = 0;

                        try 
                        {
                            out.write(s);
                    } 
                        catch (IOException e) 
                        {

                    }
                }
                else if(writeTo==1)
                {
                        try 
                        {
                            out.write(s);
                    } 
                        catch (IOException e) 
                        {

                    }
                }
}
0
ответ дан 30 November 2019 в 11:52
поделиться

Я успешно использовал TagSoup и XPath для синтаксического анализа HTML.

http://home.ccil.org/~cowan/XML/tagsoup/

0
ответ дан 30 November 2019 в 11:52
поделиться

Возможно, вы просто используете неправильный инструмент для работы:

perl -ne "print if m|<p>| .. m|</p>|" infile.txt >outfile.txt
-2
ответ дан 30 November 2019 в 11:52
поделиться

Используйте ParserCallback. Это простой класс, включенный в JDK. Он уведомляет вас каждый раз, когда обнаруживается новый тег, а затем вы можете извлечь текст тега. Простой пример:

import java.io.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class ParserCallbackTest extends HTMLEditorKit.ParserCallback
{
    private int tabLevel = 1;
    private int line = 1;

    public void handleComment(char[] data, int pos)
    {
        displayData(new String(data));
    }

    public void handleEndOfLineString(String eol)
    {
        System.out.println( line++ );
    }

    public void handleEndTag(HTML.Tag tag, int pos)
    {
        tabLevel--;
        displayData("/" + tag);
    }

    public void handleError(String errorMsg, int pos)
    {
        displayData(pos + ":" + errorMsg);
    }

    public void handleMutableTag(HTML.Tag tag, MutableAttributeSet a, int pos)
    {
        displayData("mutable:" + tag + ": " + pos + ": " + a);
    }

    public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet a, int pos)
    {
        displayData( tag + "::" + a );
//      tabLevel++;
    }

    public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos)
    {
        displayData( tag + ":" + a );
        tabLevel++;
    }

    public void handleText(char[] data, int pos)
    {
        displayData( new String(data) );
    }

    private void displayData(String text)
    {
        for (int i = 0; i < tabLevel; i++)
            System.out.print("\t");

        System.out.println(text);
    }

    public static void main(String[] args)
    throws IOException
    {
        ParserCallbackTest parser = new ParserCallbackTest();

        // args[0] is the file to parse

        Reader reader = new FileReader(args[0]);
//      URLConnection conn = new URL(args[0]).openConnection();
//      Reader reader = new InputStreamReader(conn.getInputStream());

        try
        {
            new ParserDelegator().parse(reader, parser, true);
        }
        catch (IOException e)
        {
            System.out.println(e);
        }
    }
}

Итак, все, что вам нужно сделать, это установить логический флаг при обнаружении тега абзаца. Затем в методе handleText () вы извлекаете текст.

0
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: