2012-08-13 36 views
1

當一個文檔轉換過程的結果比較原始與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

就如何解決這個問題的任何想法?

+0

此警告在執行過程中也會出現,不確定它是否相關:WARN [org.docx4j.openpackaging.contenttype.ContentTypeManager] - ' – 2012-08-13 14:02:20

回答

0

在Docx4jDriver在管線192和206有:

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

你可能需要添加的xmlns:○。最終,需要對代碼進行改進以自動添加所有相關的名稱空間。