XmlDocument.LoadXml()挂了好几分钟

时间:2012-09-14 16:28:19

标签: .net xml vb.net xmldocument

我有一个例程,它解析来自HTTP请求的XML响应,我使用XmlDocument.LoadXml来帮助完成此操作。我依靠这个方法在错误的XML上抛出一个异常,并在成功时返回一个加载的XmlDocument对象。

我没想到的是挂起几分钟加载文件。当我在测试环境中运行此代码时,它会在100%的时间内挂起几分钟。看起来像.NET中的一些错误......

    Dim tstring As String = ""

    tstring &= "" & vbCrLf
    tstring &= "" & vbCrLf
    tstring &= "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">" & vbCrLf
    tstring &= "" & vbCrLf
    tstring &= "<html> xmlns=""http://www.w3.org/1999/xhtml"" >" & vbCrLf
    tstring &= "<head><title>" & vbCrLf
    tstring &= "    Error" & vbCrLf
    tstring &= "</title></head>" & vbCrLf
    tstring &= "<body>" & vbCrLf
    tstring &= "</body>" & vbCrLf
    tstring &= "</html>" & vbCrLf

    Dim MyXmlDoc As New XmlDocument
    MyXmlDoc.LoadXml(tstring)

文档中可以删除以防止其挂起的特定行是:

    tstring &= "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">" & vbCrLf

我是否必须在字符串中搜索“&lt;!DOCTYPE html”而不是在看到它时调用LoadXml()?我对此问题的关注是其他陷阱在这个方法中等着我吗?

1 个答案:

答案 0 :(得分:8)

loadxml调用正在解析doctype以进行验证,因此它必须获取该url - 在这种情况下这很慢。您可以在浏览器中测试directly

另一个问题provides a workaround - 引用:

  .NET 4.0中的

XmlTextReader有一个名为DtdProcessing的属性。   当设置为DtdProcessing.Ignore时,它应该禁用DTD处理。

  

doc.XmlResolver = null;

for .NET 3.5应该可行。