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

12

为什么System.Xml.XmlDocument.LoadXml方法会抛出System.Net.WebException异常?

这真的是令人难以置信的疑惑,如果MSDN没错的话,LoadXml最多只会给我一个System.Xml.XmlException异常。

然而我却遇到了奇怪的异常:

The underlying connection was closed: The connection was closed unexpectedly.

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)

到底是什么导致了异常?


4
尝试逐步减少XML文件内容,找到问题的源头直到问题消失。然后用简明的示例更新你的问题。 - Daniel Hilgarth
我假设DOCTYPE声明已被解析,如果删除DOCTYPE,则可以正常工作而不会出错。 - Paul
2个回答

10

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

3
在调用Load()或LoadXml()之前,将XmlDocument的XmlResolver属性设置为Nothing也可以实现这一点。 - Paul

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接