我有一个例程,它解析来自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()?我对此问题的关注是其他陷阱在这个方法中等着我吗?
答案 0 :(得分:8)
loadxml调用正在解析doctype以进行验证,因此它必须获取该url - 在这种情况下这很慢。您可以在浏览器中测试directly。
另一个问题provides a workaround - 引用:
.NET 4.0中的XmlTextReader有一个名为DtdProcessing的属性。 当设置为DtdProcessing.Ignore时,它应该禁用DTD处理。
和
doc.XmlResolver = null;
for .NET 3.5应该可行。