2012-04-21 19 views
4

解析XML文件時忽略內聯DTD有問題讀取與DTD聲明中一個XML文件(外部聲明解決)。我正在使用SAX方法(javax.xml.parsers.SAXParser)。當沒有DTD定義解析看起來像例如StartEement-Characters-StartElement-Characters-EndElement-Characters ......所以在Start或End元素之後立即調用字符方法,這就是我需要它的方式。當DTD處於文件解析架構更改爲例如StartElement-StartElement-StartElement-Characters-EndEement-EndEement-EndEement時。而且我需要在每個元素之後使用Characters方法。所以我問有沒有辦法來防止解析模式的改變?我如何在Java

我的代碼:

SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(false); 

SAXParser parser = factory.newSAXParser(); 
XMLReader reader = parser.getXMLReader(); 

reader.setFeature("http://xml.org/sax/features/validation", false); 
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
reader.setFeature("http://xml.org/sax/features/external-general-entities", false); 
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 
reader.setFeature("http://xml.org/sax/features/use-entity-resolver2", false); 
reader.setFeature("http://apache.org/xml/features/validation/unparsed-entity-checking", false); 
reader.setFeature("http://xml.org/sax/features/resolve-dtd-uris", false); 
reader.setFeature("http://apache.org/xml/features/validation/dynamic", false); 
reader.setFeature("http://apache.org/xml/features/validation/schema/augment-psvi", false); 

reader.parse(input); 

還有就是我試圖解析link(它在我的Dropbox的鏈接)的XML文件。

回答

4

我懷疑之前報告給characters()回調的節點現在正在報告給ignorableWhitespace()回調。最簡單的解決方案可能是從ignorableWhitespace()簡單地呼叫characters()

這是規範不得不說的ignorableWhitespace()

驗證解析器必須使用此方法來報告元素內容 空白的每個數據塊(見W3C XML 1.0 recommendation, section 2.10):無驗證的解析器也可以使用這種方法,如果他們 能夠解析和使用內容模型。

換句話說,如果有一個DTD,如果你不驗證,然後 它是由解析器是否在元素只有 內容模型使用characters()回調或 ignorableWhitespace()回調報告的空白。

+0

非常感謝。它完美的作品。 – JavaXML 2012-04-21 21:39:54