2014-03-27 45 views
5

Java org.w3c.dom庫的作者選擇不支持Iterable接口的原因是否有任何理由?例如,界面NodeList看起來非常適合擴展Iterable。org.w3c.dom.NodeList不擴展Iterable

+1

剛纔問我同樣的問題,org.w3c.dom出現在JDK 1.4和JDK 1.2中的迭代器中。簡單的答案是,Java綁定的W3C規範再次由某人從未編碼過(用Java編寫)。 事實上NodeList是不可迭代的,並且沒有遵循任何約定(getLength !!是什麼)真的是一個巨大的痛苦。 – Julien

回答

4

萬維網聯盟定義了Document Object Model (DOM)如下:

文檔對象模型是一個平臺和語言無關的 接口,它允許程序和腳本動態訪問 和更新文件的內容,結構和風格。

很多語言的實現看起來非常相似,聰明的人認爲這是一個好主意,很多年前他們設計的時候。因此,它看起來不像任何語言中熟悉的任何東西。

如果要使用看起來像Java庫的w3c DOM的替代方法,請使用JDOM。或映射你的XML到Java對象使用映射/約束力的解決方案,如JAXB

但是如果你需要與已經使用W3C DOM(如內置XSLT和XSD處理器)現有的庫的接口,那麼你」重新卡住它。不幸。


要@eis:

是有,你不能添加一個接口,如IterableNodeList一個原因,那原因是Java的文檔對象模型的結合中被定義the standard。取NodeList,標準中定義爲100%。沒有空間用於任何額外的接口。

組織/ W3C/DOM/NodeList.java:

package org.w3c.dom; 

public interface NodeList { 
    public Node item(int index); 

    public int getLength(); 

} 

有在C#標準沒有約束力,但有一個爲EcmaScript的。我相信你提到的IXMLDocument接口也可以用於他們的EcmaScript實現(但我可能是錯的),在這種情況下,他們仍然需要堅持標準的方法支持哪些方法以及類型層次結構。

不同之處在於EcmaScript綁定只描述應該存在哪些方法,而Java綁定則描述接口中的確切方法。 儘管在Java中沒有理由實現NodeList的類也不能實現Iterable。但是,如果您的代碼依賴於它不適用於DOM標準,但僅適用於特定的實現。

微軟從來沒有真正困擾過這種美好的區別,因爲他們通常不會滿足多標準兼容的實現 - 如果您使用任何Microsoft標記的方法「*表示擴展到萬維網聯盟W3C)DOM。「在微軟的實現中,那麼你並沒有使用DOM標準。

+1

我不認爲DOM是與語言無關的接口,與java接口org.w3c.dom庫實現的事實有關。例如,Microsoftofts MSXML DOM具有[IXMLDOMDocument](http://msdn.microsoft.com/en-us/library/windows/desktop/dd892951%28v=vs.85%29.aspx),[IXMLDOMDocument2](http: //msdn.microsoft.com/en-us/library/ms761358%28v=vs.85%29.aspx)和[IXMLDOMDocument3](http://msdn.microsoft.com/en-us/library/ms763789%28v = vs.85%29.aspx)接口互補,並添加擴展到DOM規範。 – eis

+0

簡而言之:AFAIK規範沒有強制要求Java以類似的方式在org.w3c.dom中添加Iterable等Java特定接口。 – eis

+0

@eis新增了我對 –