1

我有一个字符串,如果它是有效的 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 加载到之前没有更快的方法来验证 XMLXmlDocument吗?

4

1 回答 1

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。

于 2012-08-25T08:27:50.183 回答