2

.docx ファイルの読み取りと解析に docx4j を使用していますが、段落を反復処理すると、すべての段落ではなく 1 回のパスで読み取ります。以下は、私が使用しているコードのサンプルです。

private void replaceAcrAndDef(String acrName, String acrParensName, String oldDef, String newDef){
    String XPATH_TO_SELECT_TEXT_NODES = "//w:t";
    List<Object> paragraphs = template.getMainDocumentPart().getJAXBNodesViaXPath(XPATH_TO_SELECT_TEXT_NODES, true);
    for (Object obj : paragraphs){
        Text text = (Text) ((JAXBElement)obj).getValue();
        String textValue = text.getValue();
        System.out.println(textValue);
 }

上記の for ループの 1 回のパス中に、これは最初の段落として読み取られます -

「チームは、ミッション、テスト、管理および一般サービスのネットワークとシステムについて直接 MDA の経験を積むことで、要件を深く理解しています。ミッション、プロセス、および優先事項について確立された理解を持つ、低リスクで応答性の高いチームであることの利点。統合ベースの使用」

しかし、段落の最後の部分がありません。連続パスで出てくるもの。ここで何が間違っていますか。

段落の内容全体は次のとおりです。

チームは、ミッション、テスト、管理および一般サービスのネットワークとシステムの MDA を直接経験することで、要件を深く理解しています。利点は、ミッション、プロセス、および優先事項を十分に理解している、低リスクで反応の良いチームです。統合された情報技術ベースの役割ベースの管理 (RBA) アプローチの使用は、関連請負業者、既存のプロセス、および補完的なプロセスの追加と相乗的に機能します。

段落全体を取得する方法があるかどうかはわかりませんが、段落ごとに文字列の置換を行う必要があるため、それがあれば素晴らしいでしょう。

4

3 に答える 3

5

コメントを回答に展開します。

段落に複数のテキスト要素 (w:t) が含まれていると思います。この問題のサンプル ドキュメントを提供していただけますか? 段落要素で TextUtils.extractText を使用してテキストを抽出するのはどうですか?

P.toString() を試してください。TextUtils が参照されていますが、これは StringWriter でも試すことができます。


P.toString() の使用:

// Request paragraphs
final String XPATH_TO_SELECT_TEXT_NODES = "//w:p";
final List<Object> jaxbNodes = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath(XPATH_TO_SELECT_TEXT_NODES, true);

for (Object jaxbNode : jaxbNodes){
    final String paragraphString = jaxbNode.toString();
    System.out.println(paragraphString);
}

TextUtils.extractText (...)StringWriterの使用:

for (Object jaxbNode : jaxbNodes){
    final StringWriter stringWriter = new StringWriter();
    TextUtils.extractText(jaxbNode, stringWriter);
    final String paragraphString = stringWriter.toString();
    System.out.println(paragraphString);
}
于 2012-11-05T21:50:05.323 に答える
2

これらのメソッドを使用して、docx4j を使用して検索と置換を実行しています ( http://www.smartjava.org/content/create-complex-word-docx-documents-programatically-docx4jに触発されました):

public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj);
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result;
}

public static void findAndReplace(WordprocessingMLPackage doc, String toFind, String replacer){
    List<Object> paragraphs = getAllElementFromObject(doc.getMainDocumentPart(), P.class);
    for(Object par : paragraphs){
        P p = (P) par;
        List<Object> texts = getAllElementFromObject(p, Text.class);
        for(Object text : texts){
            Text t = (Text)text;
            if(t.getValue().contains(toFind)){
                t.setValue(t.getValue().replace(toFind, replacer));
            }
        }
    }
}

お役に立てれば。

于 2013-05-23T10:37:10.513 に答える
1

Sun/Oracle JAXB の XPath には多くの既知の欠陥が含まれており、実際にはその約束よりも役に立たないものになっています。

私はそれを使用しません。代わりに、次のようなものを使用します。

    static class PFinder extends CallbackImpl {

            List<P> paragraphList = new ArrayList<P>();  

            @Override
            public List<Object> apply(Object o) {

                    if (o instanceof P ) {
                          paragraphList .add((P)o);
                    }                      
                    return null;
            }
    }

            PFinder PFinder = new PFinder();
            new TraversalUtil(paragraphs, PFinder);

            for ( P p : pFinder.paragraphList ) { ...

w:t を探して、同様のことを行うことができます

または、本当に XPath を使い続けたい場合は、MOXyを試すことができます。

より一般的には、文字列置換アプローチではなく、コンテンツ コントロール databindingの使用を検討することをお勧めします。docx4j では、コンテンツ コントロールのデータ バインディングにより、次のようなさまざまな利点が得られます。

  • 繰り返し素材 (テーブルの行など)
  • コンテンツの条件付き包含/除外
  • 画像を含める (base64 エンコード)
  • XHTML コンテンツのインポート
于 2012-11-02T20:10:46.760 に答える