0

私はここからdocxファイルを比較するための提案を取りました:docx4jを使用してdocx比較を行っている間のOutOfMemoryError

ただし、この行:

Body newBody = (Body) org.docx4j.XmlUtils.unmarshalString(contentStr);

次のようないくつかのJAXB警告をトリガーします。

WARN org.docx4j.jaxb.JaxbValidationEventHandler .handleEvent line 80 - [ERROR] : unexpected element (uri:"", local:"ins"). Expected elements are <{[?]}text>
INFO org.docx4j.jaxb.JaxbValidationEventHandler .handleEvent line 106 - continuing (with possible element/attribute loss)

ネストされたタグのorg.docx4j.wml.Text処理を示しておらず、によって書き込まれた文字列に次のものが含まれていることを考えると、これは理解できます。Docx4jDriver.diff()

<w:t dfx:insert="true" xml:space="preserve"><ins>This</ins><ins> </ins><ins>first</ins><ins> </ins><ins>line</ins><ins> </ins><ins>has</ins><ins> </ins><ins>a</ins><ins> </ins></w:t>

したがって、タグText.getValue()を含む呼び出し<ins>は空の文字列を返します。

提案されたアプローチと次のコードを使用して、2つのdocxファイル間の差分(元の+ docx変換プロセスのラウンドトリップの結果)をプログラムで決定しようとしています。

Body newBody = (Body) org.docx4j.XmlUtils.unmarshalString(contentStr);

for ( Object bodyPart : newBody.getContent() ) {
  if ( bodyPart instanceof P ) {
    P bodyPartInCast = (P)bodyPart;
    for ( Object currentPContent : bodyPartInCast.getContent() ) {
      if ( currentPContent instanceof R ) {
        R pContentCast = (R)currentPContent;
        for( Object currentRContent : pContentCast.getContent() ) {
          if ( currentRContent instanceof JAXBElement ) {
            JAXBElement rContentCast = (JAXBElement)currentRContent;
            Object jaxbValue = rContentCast.getValue();
            if ( jaxbValue instanceof Text ) {
              Text textValue = (Text)jaxbValue;
              System.out.println( "Text: --> " + textValue.getValue() );
            } 
          }
        }
      } 
    }
  } 
}

したがって、問題は、これが2つのファイル間の違いの詳細を処理するための正しいアプローチではない場合、何ですか?

私はdocx4jバージョン2.8.0を使用しており、比較されている2つのdocxファイルは次のとおりです。

  1. ドキュメント1(入力)
  2. ドキュメント2(出力)
4

1 に答える 1

-1

開示:私はdocx4jに取り組んでいます

Differencerを使用してdiffの結果を有効なWordMLコンテンツに変換するCompareDocumentsをご覧ください。

于 2012-07-05T22:23:39.073 に答える