2011-09-12 25 views
10

¿Por qué el método System.Xml.XmlDocument.LoadXml arroja System.Net.WebException?¿Por qué XmlDocument.LoadXml lanza System.Net.WebException?

Esto es realmente alucinante loco, si MSDN tenía razón, LoadXml debería como máximo darme un System.Xml.XmlException.

Sin embargo, he excepciones raras como:

la conexión subyacente se cerró: La conexión se cerró inesperadamente.

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) 

Lo que en la tierra está causando la excepción?

+4

** [TL; DR] (http: //en.wikipedia. org/wiki/Wikipedia: Too_long; _didn% 27t_read) ** ... Intente encontrar el origen de este problema usted mismo reduciendo gradualmente el XML hasta que desaparezca el problema. Después de eso, actualice su pregunta con un ejemplo conciso. –

+0

@Daniel ok editado – Pacerier

+0

Supongo que la declaración DOCTYPE se está resolviendo, ya que funcionará sin error si se elimina DOCTYPE. – Paul

Respuesta

7

El XmlReader interno de un XmlDocument utiliza un XmlResolver para cargar recursos externos. Debe evitar la apertura de la DTD configurando XmlResolver en nulo y configurando DtdProcessing para ignorar. Esto se puede hacer aplicando un objeto XmlReaderSettings a un nuevo XmlReader. Este lector se puede usar para cargar el XML en XmlDocument. Eso debería resolver su problema.

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 
+2

Esto también se puede hacer estableciendo la propiedad XmlResolver de XmlDocument en Nothing, antes de llamar a Load() o LoadXml(). – Paul

Cuestiones relacionadas