Почему XmlDocument.LoadXml создает исключение System.Net.WebException? - PullRequest
11 голосов
/ 12 сентября 2011

Почему 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)

Что на земле вызывает исключение?

Ответы [ 2 ]

8 голосов
/ 12 сентября 2011

Внутренний XmlReader XmlDocument использует XmlResolver для загрузки внешних ресурсов. Вы должны предотвратить открытие DTD, установив XmlResolver на ноль и установив DtdProcessing на игнорирование. Это можно сделать, применив объект 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
4 голосов
/ 12 сентября 2011

Эдвин дал вам решение, а я объясню причину разрыва соединения:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...