如何检查长字符串是否是有效的XML?

时间:2012-08-25 08:15:22

标签: c# .net xml xmldocument

我有一个字符串,如果它是一个有效的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是否有更快的方法?

1 个答案:

答案 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。