2012-04-25 46 views
1

我正在使用Java SAX解析器(org.xml.sax.ext.DefaultHandler2的實現)來解析XML文檔,並且此文檔具有指向DTD的DOCTYPE聲明。出於某些奇怪的原因,我需要知道「doctype」關鍵字本身已被寫入原始文檔的情況,以便我可以使用完全相同的大小寫輸出文檔。從SAX java XML解析器中,我如何知道「DOCTYPE」關鍵字的情況?

這是,我需要能夠區分:

<!DOCTYPE thing SYSTEMID ...> 

...來自:

<!doctype thing SYSTEMID ...> 

有沒有辦法實現從解析器本身? (我的意思是,不訴諸執行解析器之前讀取該流的前n個字節)

由於

+1

嘗試覆蓋[DefaultHandler.notationDecl](http://docs.oracle.com/javase/6/docs/api/org/xml/sax/helpers/DefaultHandler.html#notationDecl)並查看是否'name'參數就是你要找的。 – 2012-04-25 11:43:36

+0

不,notationDecl在我的解析過程中甚至沒有被調用...... – 2012-04-25 12:07:03

回答

2

最後,java XML解析器似乎沒有辦法告訴你有關DOCTYPE子句的原始情況,因爲它會認爲它始終是大寫的(這是XML規範所說的,但如果您嘗試使用這種XML解析器來解析HTML5,則可能並非如此)。

我解決這個問題的方法是實現我自己的java.io.Reader,它允許我讀取文件的字節並確定DOCTYPE子句的原始大小寫,然後在XML SAX解析器中使用此Reader 。一旦解析完成,我會詢問讀者對象該條款的情況,我會得到正確的答案。

這是混亂和醜陋的,但...似乎是唯一的真正選擇。

3

如果輸入是XML,然後DOCTYPE是大寫。相反,如果DOCTYPE爲小寫,則輸入不是XML。所以,如果SAX解析器成功通過DOCTYPE聲明,就知道它是大寫的。

+0

嗯..這就是我爲什麼說「出於某些奇怪的原因」。我使用這個XML解析器來解析HTML5,而在HTML5中,DOCTYPE子句不區分大小寫。對不起,但告訴我「你不需要那樣做」不是一個有效的答案:-)。在任何人說出來之前,告訴我「你不能用XML解析器解析HTML5」也不是有效的答案:-)。我正在做這件事,因爲我確實需要這樣做。 – 2012-04-25 17:39:54