2

Javaを使用して、特定のテキストドキュメントからツリーのような構造を取得する必要があります。使用されるファイルタイプは一般的でオープンである必要があります(rtf、odt、...)。現在、Apache Tikaを使用して、複数のドキュメントからプレーンテキストを解析しています。

正しい構造を最も確実に解析できるようにするには、どのファイルタイプとAPIを使用する必要がありますか?ティカでこれが可能なら、どんなデモンストレーションも見たいです。

たとえば、特定のドキュメントからこの種のデータを取得する必要があります。

Main Heading
  Heading 1
    Heading 1.1
  Heading 2
    Heading 2.2

主な見出しは論文のタイトルです。紙には、見出し1と見出し2の2つの主要な見出しがあり、両方に1つの小見出しがあります。また、各見出し(段落テキスト)の下にコンテンツを取得する必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

3

OpenDocument(.odt)は、実際には複数のxmlファイルを含むzipパッケージです。Content.xmlには、ドキュメントの実際のテキストコンテンツが含まれています。見出しに関心があり、text:hタグ内にあります。ODTについてもっと読む。

QueryPathを使用して.odtファイルから見出しを抽出するための実装を見つけました。

元々の質問はJavaに関するものだったので、ここにあります。まず、ZipFileを使用してcontent.xmlにアクセスする必要があります。次に、SAXを使用してcontent.xmlからxmlコンテンツを解析します。サンプルコードは、すべての見出しを出力するだけです。

Test3.odt
content.xml
3764
1 My New Great Paper
2 Abstract
2 Introduction
2 Content
3 More content
3 Even more
2 Conclusions

Sample code:

    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"));

}

Relevant parts of used ContentHandler look like this:

    @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);

    }

}
于 2011-02-14T11:04:15.533 に答える