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
答
// 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);
谢谢大家帮助我。
这很有可能是HTML不是有效的XML。这可能是问题吗? – 2013-03-08 11:27:31
你可以扩展你卡住的意思吗?您的Handler中的回调实际上是否被调用?是否有任何异常被抛出? – DaveJohnston 2013-03-08 11:29:25
@ sven - 但如何从这里离开,如果html无效 – Nitendra 2013-03-08 11:30:18