当一个文档转换过程的结果比较原始与docx4j,我们得到以下错误为我们的测试情况之一:未声明的命名空间与邻:allowincell在docx4j Differencer.diff()调用
com.topologi.diffx.xml.UndeclaredNamespaceException: The namespace URI "urn:schemas-microsoft-com:office:office for allowincell" has not been mapped to any prefix.
我消除利用该方法在原始文档进行比较,以本身被改造的探讨过程中引入的误差(基于this answer)的可能性:
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();
}
的Stac ķ跟踪:
com.topologi.diffx.xml.UndeclaredNamespaceException: The namespace URI "urn:schemas-microsoft-com:office:office for allowincell" has not been mapped to any prefix. at com.topologi.diffx.xml.NSAwareXMLWriter.getQName(NSAwareXMLWriter.java:604) at com.topologi.diffx.xml.NSAwareXMLWriter.attribute(NSAwareXMLWriter.java:527) at com.topologi.diffx.event.impl.AttributeEventNSImpl.toXML(AttributeEventNSImpl.java:244) at com.topologi.diffx.format.SmartXMLFormatter.format(SmartXMLFormatter.java:212) at com.topologi.diffx.sequence.EventSequence.format(EventSequence.java:349) at com.topologi.diffx.Docx4jDriver.diff(Docx4jDriver.java:230) at org.docx4j.diff.Differencer.diffWorker(Differencer.java:320) at org.docx4j.diff.Differencer.diff(Differencer.java:298) at exec.DocxCompareTest.compareToSelf(DocxCompareTest.java:212) at exec.DocxCompareTest.handleInputFile(DocxCompareTest.java:124) at exec.ValidationTest.execute(ValidationTest.java:52) at exec.BtbRoundtripTest.main(BtbRoundtripTest.java:13) java.lang.NullPointerException at org.docx4j.diff.Differencer.diffWorker(Differencer.java:377) at org.docx4j.diff.Differencer.diff(Differencer.java:298) at exec.DocxCompareTest.compareToSelf(DocxCompareTest.java:212) at exec.DocxCompareTest.handleInputFile(DocxCompareTest.java:124) at exec.ValidationTest.execute(ValidationTest.java:52) at exec.BtbRoundtripTest.main(BtbRoundtripTest.java:13)
我解压* .docx文件和o:allowincell
似乎是在包含document.xml
的<w:document>
标签与xmlns:o="urn:schemas-microsoft-com:office:office"
正确映射。
测试文件可以从这里才可下载:https://docs.google.com/open?id=0B6_h2TfqvEdeZE43X3RSWnFIZHc
就如何解决这个问题的任何想法?
此警告在执行过程中也会出现,不确定它是否相关:WARN [org.docx4j.openpackaging.contenttype.ContentTypeManager] -' –
2012-08-13 14:02:20