当使用 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
关于如何解决这个问题的任何想法?