Разобрать структуру документа с помощью Java - PullRequest
2 голосов
/ 10 февраля 2011

Нам нужно получить древовидную структуру из данного текстового документа, используя Java. Используемый тип файла должен быть общим и открытым (rtf, odt, ...). В настоящее время мы используем Apache Tika для анализа простого текста из нескольких документов.

Какой тип файла и API мы должны использовать, чтобы мы могли наиболее надежно проанализировать правильную структуру? Если это возможно с Тикой, я был бы рад увидеть любые демонстрации.

Например, мы должны получить данные такого типа из данного документа:

Main Heading
  Heading 1
    Heading 1.1
  Heading 2
    Heading 2.2

Главным заголовком является название статьи. Бумага имеет два основных заголовка: заголовок 1 и заголовок 2, и оба имеют один подзаголовок. Мы также должны получить содержимое под каждым заголовком (текст абзаца).

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 14 февраля 2011

OpenDocument (.odt) - это практически zip-пакет, содержащий несколько файлов xml.Content.xml содержит фактическое текстовое содержание документа.Нас интересуют заголовки, и их можно найти внутри текста: h-теги.Подробнее о ODT .

Я нашел реализацию для извлечения заголовков из файлов .odt с помощью QueryPath .

Поскольку первоначальный вопрос был о Java, вот.Сначала нам нужно получить доступ к content.xml с помощью ZipFile.Затем мы используем SAX для анализа содержимого XML из файла content.xml.Пример кода просто распечатывает все заголовки:

<code>Test3.odt
content.xml
3764
1 My New Great Paper
2 Abstract
2 Introduction
2 Content
3 More content
3 Even more
2 Conclusions
</p> <p>Sample code:</p> <pre> public void printHeadingsOfOdtFIle(File odtFile) { try { ZipFile zFile = new ZipFile(odtFile); System.out.println(zFile.getName()); ZipEntry contentFile = zFile.getEntry("content.xml"); System.out.println(contentFile.getName()); System.out.println(contentFile.getSize()); XMLReader xr = XMLReaderFactory.createXMLReader(); OdtDocumentContentHandler handler = new OdtDocumentContentHandler(); xr.setContentHandler(handler); xr.parse(new InputSource(zFile.getInputStream(contentFile))); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new OdtDocumentStructureExtractor().printHeadingsOfOdtFIle(new File("Test3.odt")); }

Соответствующие части используемого ContentHandler выглядят так:

@Override
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {

    temp = "";

    if("text:h".equals(qName)) {

        String headingLevel = atts.getValue("text:outline-level");

        if(headingLevel != null) {

            System.out.print(headingLevel + " ");

        }

    }

}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {

    char[] subArray = new char[length];
    System.arraycopy(ch, start, subArray, 0, length);
    temp = new String(subArray);

    fullText.append(temp);
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

    if("text:h".equals(qName)) {

        System.out.println(temp);

    }

}
</code>
...