【问题标题】:Why does XmlDocument.LoadXml throw System.Net.WebException?为什么 XmlDocument.LoadXml 会抛出 System.Net.WebException?
【发布时间】:2011-09-12 13:49:08
【问题描述】:

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

到底是什么导致了异常?

【问题讨论】:

  • TL;DR...尝试自己寻找问题的根源,逐步减少XML,直到问题消失。之后用一个简洁的例子更新你的问题。
  • 我假设正在解析 DOCTYPE 声明,因为如果删除了 DOCTYPE,它将正常工作。

标签: .net xml vb.net exception-handling xmldocument


【解决方案1】:

XmlDocument 的内部 XmlReader 使用 XmlResolver 加载外部资源。您应该通过将XmlResolver 设置为null 并将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

【讨论】:

  • 这也可以通过在调用 Load() 或 LoadXml() 之前将 XmlDocument 的 XmlResolver 属性设置为 Nothing 来完成。
【解决方案2】:

Edwin 给了你解决方案,我给你连接断开的原因:

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

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 2021-12-20
    • 2021-03-05
    • 2021-03-19
    • 2023-03-14
    • 2021-04-09
    • 2014-12-18
    • 2013-12-08
    • 2010-09-27
    相关资源
    最近更新 更多