我有一个字符串,如果它是一个有效的XML ,我想用它做一些事情;如果没有,请告诉用户该字符串不是有效的XML。
我的代码是:
try
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(rawData);
//And here I want to do some things with doc if it is a valid XML.
}
catch
{
//Tell the user that the string is not a valid XML.
}
现在,如果rawData
包含有效的XML数据,则没有问题。此外,如果rawData
包含其他内容(例如HELLOEVERYBODY!
),它将抛出异常,因此我可以告诉用户该字符串不是有效的XML 。
但是当rawData
包含HTML页面时,该过程需要很长时间(超过20秒!)......
页面之间可能有所不同。例如,它可以快速处理stackoverflow.com
,但处理1pezeshk.com
需要很长时间......
在将XML加载到XmlDocument
之前验证XML是否有更快的方法?
答案 0 :(得分:2)
之前我见过这个问题,问题是XmlDocument尝试下载文档的DTD。在您的示例中,这是http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd,它允许您打开连接但从不返回任何内容。因此,一个简单的解决方案(没有任何类型的错误检查)是删除像-tag之前的任何内容。
WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
string data = wc.DownloadString("http://1pezeshk.com/");
data = data.Remove(0, data.IndexOf("<html"));
XmlDocument xml = new XmlDocument();
xml.LoadXml(data);
浏览http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd会导致DTD返回,但响应时间超过一分钟。由于您仍然不会进行DTD验证,因此您应该从HTML中删除它,然后尝试将其验证为HTML。