1

ドキュメント変換プロセスの結果を docx4j で元の結果と比較すると、テスト ケースの 1 つで次のエラーが発生します。

com.topologi.diffx.xml.UndeclaredNamespaceException: The namespace URI "urn:schemas-microsoft-com:office:office for allowincell" has not been mapped to any prefix.

この方法を使用して元のドキュメントをそれ自体と比較することにより、変換プロセスによって発生するエラーの可能性を排除しました (この回答に基づく):

private static final String compareToSelf( File fileToCompare ) throws Docx4JException {
    WordprocessingMLPackage olderPackage = WordprocessingMLPackage.load( fileToCompare );
    WordprocessingMLPackage newerPackage = WordprocessingMLPackage.load( fileToCompare );

    Body newerBody = newerPackage.getMainDocumentPart().getJaxbElement().getBody();
    Body olderBody = olderPackage.getMainDocumentPart().getJaxbElement().getBody();

    java.io.StringWriter sw = new java.io.StringWriter();
    javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(sw);
    Calendar changeDate = null;

    Differencer pd = new Differencer();
    pd.setRelsDiffIdentifier("blagh"); // not necessary in this case
    pd.diff( newerBody, olderBody, result, "someone", changeDate,
                newerPackage.getMainDocumentPart().getRelationshipsPart(),
                olderPackage.getMainDocumentPart().getRelationshipsPart() );

    return sw.toString();
}

スタックトレース:

com.topologi.diffx.xml.UndeclaredNamespaceException: 名前空間 URI "urn:schemas-microsoft-com:office:office for allowincell" は、どのプレフィックスにもマップされていません。
    com.topologi.diffx.xml.NSAwareXMLWriter.getQName (NSAwareXMLWriter.java:604) で
    com.topologi.diffx.xml.NSAwareXMLWriter.attribute (NSAwareXMLWriter.java:527) で
    com.topologi.diffx.event.impl.AttributeEventNSImpl.toXML (AttributeEventNSImpl.java:244) で
    com.topologi.diffx.format.SmartXMLFormatter.format (SmartXMLFormatter.java:212) で
    com.topologi.diffx.sequence.EventSequence.format (EventSequence.java:349) で
    com.topologi.diffx.Docx4jDriver.diff (Docx4jDriver.java:230) で
    org.docx4j.diff.Differencer.diffWorker (Differencer.java:320) で
    org.docx4j.diff.Differencer.diff (Differencer.java:298) で
    exec.DocxCompareTest.compareToSelf (DocxCompareTest.java:212) で
    exec.DocxCompareTest.handleInputFile (DocxCompareTest.java:124) で
    exec.ValidationTest.execute (ValidationTest.java:52) で
    exec.BtbRoundtripTest.main (BtbRoundtripTest.java:13) で
java.lang.NullPointerException
    org.docx4j.diff.Differencer.diffWorker (Differencer.java:377) で
    org.docx4j.diff.Differencer.diff (Differencer.java:298) で
    exec.DocxCompareTest.compareToSelf (DocxCompareTest.java:212) で
    exec.DocxCompareTest.handleInputFile (DocxCompareTest.java:124) で
    exec.ValidationTest.execute (ValidationTest.java:52) で
    exec.BtbRoundtripTest.main (BtbRoundtripTest.java:13) で

*.docx ファイルを解凍しましたが、含まれている .docxのタグでo:allowincell適切にマップされているよう です。xmlns:o="urn:schemas-microsoft-com:office:office"<w:document>document.xml

テスト ドキュメントは、 https ://docs.google.com/open?id=0B6_h2TfqvEdeZE43X3RSWnFIZHc からダウンロードできます。

この問題を解決する方法についてのアイデアはありますか?

4

1 に答える 1

0

Docx4jDriver の 192 行目と 206 行目に次の記述があります。

    e.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:w",
            "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

おそらくxmlns:oを追加する必要があります。最終的には、関連するすべての名前空間を自動的に追加するようにコードを改善する必要があります。

于 2012-08-19T22:32:05.910 に答える