次のコードを使用して、.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.....