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


为什么 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)

到底是什么造成了例外?


13102
2017-09-12 13:49


起源

TL; DR...尝试通过逐渐减少XML来找到问题的根源,直到问题消失。之后用简洁的例子更新你的问题。 - Daniel Hilgarth
@Daniel确定编辑 - Pacerier
我假设正在解决DOCTYPE声明,因为如果删除DOCTYPE,它将正常工作。 - Paul


答案:


Edwin给了你解决方案,我告诉你连接丢失的原因:

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


4
2017-09-12 15:23





XmlDocument的内部XmlReader使用XmlResolver加载外部资源。您应该通过设置来防止打开DTD XmlResolver 为null和设置 DtdProcessing 忽略。这可以通过应用a来完成 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

8
2017-09-12 15:14



这也可以通过在调用Load()或LoadXml()之前将XmlDocument的XmlResolver属性设置为Nothing来完成。 - Paul