0

次のコードを使用して、.odt ファイルからテキストを抽出しました。

public class OpenOfficeParser {

StringBuffer TextBuffer;

public OpenOfficeParser() {}

//Process text elements recursively
public void processElement(Object o) {

    if (o instanceof Element) {

        Element e = (Element) o;
        String elementName = e.getQualifiedName();

        if (elementName.startsWith("text")) {

            if (elementName.equals("text:tab")) // add tab for text:tab
                TextBuffer.append("\\t");
            else if (elementName.equals("text:s"))  // add space for text:s
                TextBuffer.append(" ");
            else {
                List children = e.getContent();
                Iterator iterator = children.iterator();

                while (iterator.hasNext()) {

                    Object child = iterator.next();
                    //If Child is a Text Node, then append the text
                    if (child instanceof Text) { 
                        Text t = (Text) child;
                        TextBuffer.append(t.getValue());
                    }
                    else
                    processElement(child); // Recursively process the child element                   
                }                   
            }
            if (elementName.equals("text:p"))
                TextBuffer.append("\\n");                   
        }
        else {
            List non_text_list = e.getContent();
            Iterator it = non_text_list.iterator();
            while (it.hasNext()) {
                Object non_text_child = it.next();
                processElement(non_text_child);                   
            }
        }               
    }
}

public String getText(String fileName) throws Exception {
    TextBuffer = new StringBuffer();

    //Unzip the openOffice Document
    ZipFile zipFile = new ZipFile(fileName);
    Enumeration entries = zipFile.entries();
    ZipEntry entry;

    while(entries.hasMoreElements()) {
        entry = (ZipEntry) entries.nextElement();

        if (entry.getName().equals("content.xml")) {

            TextBuffer = new StringBuffer();               
            SAXBuilder sax = new SAXBuilder();
            Document doc = sax.build(zipFile.getInputStream(entry));
            Element rootElement = doc.getRootElement();
            processElement(rootElement);
            break;
        }
    }    


 System.out.println("The text extracted from the OpenOffice document = " + TextBuffer.toString());
        return TextBuffer.toString();       
    }     
}

メソッドから返された文字列を使用すると、問題が発生しますgetText()。プログラムを実行し、.odt からいくつかのテキストを抽出しました。抽出されたテキストの一部を次に示します。

(no hi virtual x oy)\n\n house cat \n open it \n\n trying to....

だから私はこれを試しました

System.out.println( TextBuffer.toString().split("\\n")); 

私が受け取った出力は次のとおりです。

substring: [Ljava.lang.String;@505bb829

私もこれを試しました:

System.out.println( TextBuffer.toString().trim() );

印刷された文字列に変更はありません。

なぜこの振る舞いをするのですか?その文字列を正しく解析するにはどうすればよいですか? そして、「\n\n」で終わる各部分文字列を array[i] に追加したい場合、どうすればよいですか?

編集split():配列を返すのを忘れていたため、例を間違えて申し訳ありません。問題は、1行の配列を返すことです。私が求めているのは、なぜこれを行うのかということです:

System.out.println(Arrays.toString(TextBuffer.toString().split("\\n")));

例で書いた文字列には影響しません。

これも:

    System.out.println( TextBuffer.toString().trim() );

元の文字列には影響しません。元の文字列を出力するだけです。

を使用する理由の例を挙げたいとsplit()思います。その文字列を解析し、「\n」で終わる各部分文字列を配列行に配置するためです。例を次に示します。

私の元の文字列:

    (no hi virtual x oy)\n\n house cat \n open it \n\n trying to....

解析後、配列の各行を出力すると、出力は次のようになります。

line 1: (no hi virtual x oy)\
line 2: house cat
line 3: open it
line 4: trying to
and so on.....
4

1 に答える 1

1

あなたの質問を正しく理解していれば、私はこのようなことをします

String str = "(no hi virtual x oy)\n\n house cat \n open it \n\n trying to....";

List<String> al = new ArrayList<String>(Arrays.asList(str.toString()
            .split("\\n")));

al.removeAll(Arrays.asList("", null)); // remove empty or null string

for (int i = 0; i< al.size(); i++) {
    System.out.println("Line " + i + " : " + al.get(i).trim());
}

出力

Line 0 : (no hi virtual x oy)
Line 1 : house cat
Line 2 : open it
Line 3 : trying to....
于 2013-06-06T19:49:48.053 に答える