我試着寫一些JUnit測試的Docx4J發生器我已經寫。 我想我發生器的輸出節點與我想從字符串加載預期節點進行比較。Doc4j:比較兩個文件失敗,因爲不同的元素類型
所以,我創建了我的「實際」節點(發電機輸出),像這樣:
Node xmlNodeActual = XmlUtils.marshaltoW3CDomDocument(actual).getDocumentElement();
其中,「實際」是由我的發電機創建的對象。
對於我的「預期」節點,我寫了下面的代碼:
Document doc = docBuilder.parse(new InputSource(new ByteArrayInputStream(strXmlNode.getBytes("utf-8")))):
Node xmlNodeExpected = doc.getDocumentElement();
strXmlNode是抱着期望的XML字符串。 雖然我的兩個節點都是平等的,據我可以從視覺差異來講,調用下面的產量「假」的結果:
xmlNodeActual.isEqualNode(xmlNodeExpected)
我懷疑的原因是運行時類型的兩個節點的不同:
- xmlNodeActual:org.apache.xerces.dom.DeferredElementImpl
- xmlNodeExpected:org.apache.xerces.dom.ElementNSImpl
我喜歡我的測試設計,因爲它可以讓我爲大型生成器快速編寫大量測試用例。但是,我沒有看到將這種方法與「isEqualNode」結合使用的方法。 我必須寫我自己的比較器或者是有辦法,我不知道,以確保類型節點都是一樣的嗎?用這樣的方法
感謝邁克爾,我意識到我的方法的侷限性。但考慮到我正在工作的技術和非功能限制,這將是一個很好的妥協。我比較的節點很小,但很多。在我的設置中,冗餘名稱空間依賴項和空白都沒有問題,但是感謝您指出它。我寫過類似於saxon的東西:對於不同於XML的語言,深入等同於之前,但是我的問題與我的方法相比較少,如果有一種簡單的方法來控制分析產生的節點類型。 –
該規範沒有提示基於第二個節點樹的實現類允許比較失敗,但當然在實現中可能存在一個錯誤。就我個人而言,我認爲您忽略的兩棵樹之間存在較小的差異的可能性更大。可能值得下載Saxon並查看fn:deep-equal()(或者saxon:deep-equal())所說的內容。 –
我想我在這裏不同意: 請查看[doc](https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#isEqualNode)。 它讀取: _兩個節點是相等的當且僅當滿足以下條件:_ _這兩個節點是相同類型._ _..._ –