Sax解析器被卡住当解析Html为字符串时

问题描述:

我使用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

// 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); 

当我的代码将字符串作为字符串发送时,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);

谢谢大家帮助我。