0

XOMライブラリを使用して.docxドキュメントを解析および処理します。MS Wordは、段落タグ(<w:p>)内の実行(<w:r>)にテキストコンテンツを格納し、多くの場合、テキストをいくつかの実行に分割します。時々、すべての単語とそれらの間のすべてのスペースが別々に実行されます。スペースのみを含むランをロードすると、パーサーはそのスペースを削除して空のタグとして処理します。その結果、出力にはスペースを含まないテキストが含まれます。パーサーにすべてのスペースを保持させるにはどうすればよいですか?このパーサーを保持したいのですが、解決策がない場合は、別のパーサーをお勧めしますか?

これが私がパーサーと呼ぶ方法です:

StreamingPathFilter filter = new StreamingPathFilter("/w:document/w:body/*:*", prefixes);
Builder builder = new Builder(filter.createNodeFactory(null, contentTransform));
builder.build(documentFile);
...

StreamingTransform contentTransform = new StreamingTransform() {

   @Override
   public Nodes transform(nu.xom.Element node){
      <...process XML and output text...>
   }
}       
4

1 に答える 1

0

その間、 XOMメーリングリストのElliotte Rusty Haroldのヒントのおかげで、この問題の解決策を見つけました。

まず、これStreamingPathFilterは実際にはnu.xomパッケージの一部ではなく、に属していnux.xomます。

第二に、問題はによって引き起こされましたStreamingPathFilter。デフォルトのコンストラクターを使用するようにコードを変更するBuilderと、欠落しているスペースが出力に表示されました。

ドキュメントのためだけに、新しいコードは次のようになります。

Builder builder = new Builder();
nu.xom.Document doc = builder.build(documentFile);
context = XPathContext.makeNamespaceContext(doc.getRootElement());
Nodes nodes = doc.getRootElement().query("w:body/*", context);
for (int i = 0; i < nodes.size(); i++) {
    transform((nu.xom.Element) nodes.get(i));
}
...

private void transform(nu.xom.Element node){
    //process nodes
    ...
}
于 2012-07-10T12:11:32.643 に答える