2013-03-08 77 views
3

我使用sax解析器來解析XML作爲字符串在我的應用程序中。當我的代碼發送HTML正文作爲字符串時,薩克斯解析器卡住更長時間(超過5小時)。Sax解析器被卡住當解析Html爲字符串時

頁面源url:「http://www.cityam.com/taxonomy/term/1/all/feed」,我想分析。 此網址提供HTML頁面而不是XML。 如何處理這類問題或如何從適當的例外中從我的saxParser中解脫出來。 我的代碼是在這裏

public List<RssEntry> parseDocument(String body) { 
    // expected body is xml but getting stuck when get body of html page. 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    try { 
     SAXParser parser = factory.newSAXParser(); 
     XMLReader reader = parser.getXMLReader(); 
     parser.parse(new ByteArrayInputStream(body.getBytes("UTF-8")), this); 
    } 

    some catch block 

請幫me.Thanks

+1

這很有可能是HTML不是有效的XML。這可能是問題嗎? – 2013-03-08 11:27:31

+0

你可以擴展你卡住的意思嗎?您的Handler中的回調實際上是否被調用?是否有任何異常被拋出? – DaveJohnston 2013-03-08 11:29:25

+0

@ sven - 但如何從這裏離開,如果html無效 – Nitendra 2013-03-08 11:30:18

回答

0
// expected body is xml but getting stuck when get body of html page. 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
if(!body.startsWith("<?xml")){ 
    throw new NotXmlInputException(message); //your exception 
} 

或爲XML創建瑪文件,並使用驗證

SchemaFactory constraintFactory = 
     SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Source constraints = new StreamSource(/* your schema */); 
Schema schema = constraintFactory.newSchema(constraints); 
Validator validator = schema.newValidator(); 

try { 
    validator.validate(/* convert your string to sourse*/); 
} catch (org.xml.sax.SAXException e) { 
    log("Validation error: " + e.getMessage()); 
} 

,或者可以幫助使用

SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(true); 
1

當我的代碼將字符串作爲字符串發送時,sax解析器陷入較長時間(超過5小時)。 如果我傳遞的HTML頁面包含「http://apache.org/xml/features/nonvalidating/load-external-dtd」在dtd的正文(HTML頁面的開始),然後薩克斯分析器忙於加載外部的DTD。

所以我把這些功能當作false,然後sax解析器拋出一個錯誤,如果xml沒有很好的定義。

XMLReader reader = parser.getXMLReader(); reader.setFeature(「http://apache.org/xml/features/nonvalidating/load-external-dtd」,false); reader.setFeature(「http://apache.org/xml/features/nonvalidating/load-external-dtd」,false);

謝謝大家幫助我。