为什么XmlDocument.LoadXml抛出System.Net.WebException?

Pac*_*ier 11 .net xml vb.net xmldocument exception-handling

为什么System.Xml.XmlDocument.LoadXml方法抛出System.Net.WebException

这真是令人难以置信的疯狂,如果MSDN是对的,LoadXml最多应该给我一个System.Xml.XmlException.

然而,我有奇怪的例外,如:

底层连接已关闭:连接意外关闭.

Dim document As New XmlDocument
document.LoadXml("<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><x></x>")
MsgBox(document.LastChild.Name)
Run Code Online (Sandbox Code Playgroud)

究竟是什么造成了例外?

Edw*_*ing 9

XmlDocument的内部XmlReader使用XmlResolver加载外部资源.您应该通过将"设置XmlResolver为空"和"设置DtdProcessing为忽略" 来阻止打开DTD .这可以通过将XmlReaderSettings对象应用于新对象来完成XmlReader.然后可以使用此阅读器将XML加载到XmlDocument中.这应该可以解决你的问题.

    Dim doc As New XmlDocument()
    Dim settings As New XmlReaderSettings()
    settings.XmlResolver = Nothing
    settings.DtdProcessing = DtdProcessing.Ignore

    Using sr As New StringReader("<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><x></x>")
        Using reader As XmlReader = XmlReader.Create(sr, settings)
            doc.Load(reader)
        End Using
    End Using
Run Code Online (Sandbox Code Playgroud)

  • 这也可以通过在调用Load()或LoadXml()之前将XmlDocument的XmlResolver属性设置为Nothing来完成. (2认同)

Luc*_*ero 5

Edwin 为您提供了解决方案,我正在为您提供连接断开的原因:

http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic/