的Javadoc org.w3c.dom.Entity
狀態:獲得DOM XML實體替換文本中的Xerces
XML並不強制不進行驗證的XML處理器讀取並處理實體聲明的外部子集製作或在參數實體聲明。這意味着在外部子集中聲明的解析實體不需要被某些類的應用程序擴展,並且實體的替換文本可能不可用。當replacement text可用時,相應的實體節點的子列表表示該替換值的結構。否則,子列表是空的。
雖然它沒有引用在內部子集中做出的實體聲明,但是肯定會有一些解析器的配置,它將讀取和處理任何子集中的實體聲明?事實上,我對文檔的閱讀意味着這是默認設置。
在任何情況下,我已經測試(使用的Xerces)以下方法對已在內部子集(如圖所示)已經宣佈,並在外部子集,但foo.hasChildNodes()
返回false實體(和foo.getChildNodes()
回報foo
!)在任何情況下:
// some trivial example XML
String xml = "<!DOCTYPE example [ <!ENTITY foo 'bar'> ]>\n<example/>";
InputStream is = new ByteArrayInputStream(xml.getBytes());
// parse
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
DocumentType docType = builder.parse(is).getDoctype();
// retrieve the entity - works fine
Entity foo = (Entity) docType.getEntities().getNamedItem("foo");
// now how to get the entity's replacement text?
毫無疑問,我失去了一些相當明顯的東西;感謝您的想法。
編輯
它的答案似乎到目前爲止,我的Xerces實現是行爲不端。我會嘗試將所有Xerces庫更新到最新版本,如果解決了我的問題,我會關閉該問題。非常感謝。
UPDATE
更新的Xerces確實已經解決了這個問題,條件是該實體從文檔中引用;如果不是,那麼該節點仍然沒有孩子。我不完全清楚爲什麼會出現這種情況。如果有人能夠解釋發生了什麼並/或者指示我如何強制創建子節點,而不明確引用文檔中的每個實體,則表示感謝。
我_think_實體節點的文本內容_應該是它的「文字值」(即包含在實體聲明中的確切文本);而我在「替換文本」之後(即在字符和參數引用被替換之後)。無論如何,看到我的評論[mzjn的答案](http://stackoverflow.com/questions/6115972/obtain-xml-entity-replacement-text-from-dom-in-xerces/6117085#6117085):它返回無論如何,對我來說這是一個空字符串! – eggyal 2011-05-24 21:39:47
對,前我希望是正確的。但後者我不期望是真的;儘管我猜想閱讀DOM規範會很好。無論哪種方式,要公開任何與DTD相關的東西是相當棘手的,因爲它與「常規」XML處理有很大不同,具有不同語法的東西以及完全規則的文本替換,絕對沒有結構意識。 – StaxMan 2011-05-25 15:48:44
謝謝; [相關位](http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core。DOM規範(我的問題中引用的Javadoc已從中提取)的HTML#ID-527DCFF2)明確鏈接到XML規範中的定義;在那裏它特別區分了如上所述的「文字實體價值」和「替代文字」。但是,我認爲對於Entity節點而言,文本內容被定義爲其子節點文本內容的聚合,因此它可能是我最需要的。感謝您的幫助! – eggyal 2011-05-26 06:21:57