1

当使用 docx4j 将文档转换过程的结果与原始结果进行比较时,我们的一个测试用例出现以下错误:

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 文件,并且o:allowincell似乎正确映射到 包含的 .docx 文件xmlns:o="urn:schemas-microsoft-com:office:office"<w:document>标签中document.xml

测试文档可以从这里下载:https ://docs.google.com/open?id=0B6_h2TfqvEdeZE43X3RSWnFIZHc

关于如何解决这个问题的任何想法?

4

1 回答 1

0

在第 192 和 206 行的 Docx4jDriver 中有:

    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 回答