2010-12-14 76 views
11

je code suivant (C#), il prend trop de temps et throws Exception:.NET: Empêcher XmlDocument.LoadXml de récupérer DTD

new XmlDocument(). 
LoadXml("<?xml version='1.0' ?><!DOCTYPE note SYSTEM 'http://someserver/dtd'><note></note>"); 

Je comprends pourquoi il le fait. Ma question est comment puis-je l'arrêter? Je ne me soucie pas de la validation DTD. Je suppose que je pourrais juste le remplacer, mais je cherche une solution plus élégante.

Contexte:
Le code XML réel provient d'un site Web que je ne possède pas. Lorsque le site est en cours de maintenance, il retourne XML avec DOCTYPE qui pointe vers la DTD qui n'est pas disponible pendant la maintenance. Mon service devient donc lent car il essaie d'obtenir la DTD pour chaque XML que j'ai besoin d'analyser.

est ici pile d'exception:

Unhandled Exception: System.Net.WebException: The remote name could not be resolved: 'someserver' 
at System.Net.HttpWebRequest.GetResponse() 
at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials) 
at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) 
at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) 
at System.Xml.XmlTextReaderImpl.OpenStream(Uri uri) 
at System.Xml.XmlTextReaderImpl.DtdParserProxy_PushExternalSubset(String systemId, String publicId) 
at System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.PushExternalSubset(String systemId, String publicId) 
at System.Xml.DtdParser.ParseExternalSubset() 
at System.Xml.DtdParser.ParseInDocumentDtd(Boolean saveInternalSubset) 
at System.Xml.DtdParser.Parse(Boolean saveInternalSubset) 
at System.Xml.XmlTextReaderImpl.DtdParserProxy.Parse(Boolean saveInternalSubset) 
at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl() 
at System.Xml.XmlTextReaderImpl.ParseDocumentContent() 
at System.Xml.XmlTextReaderImpl.Read() 
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) 
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) 
at System.Xml.XmlDocument.Load(XmlReader reader) 
at System.Xml.XmlDocument.LoadXml(String xml) 
at ConsoleApplication36.Program.Main(String[] args) in c:\Projects\temp\ConsoleApplication36\Program.cs:line 11 

Répondre

10

Eh bien, dans .NET 4.0 XmlTextReader possède une propriété appelée DtdProcessing. Lorsqu'il est défini sur DtdProcessing.Ignore, il doit désactiver le traitement DTD.

+0

qu'en est-il de .net 3.5? –

+0

Vous devriez essayer de définir XmlReader.Settings.ValidationType à ValidationType.None. Alternativement, je pense que mettre XmlReader.Settings.XmlResolver à null pourrait également faire l'affaire –

+13

Confirmé 'doc.XmlResolver = null;' résout le problème. –

0

In .net 4.5.1 Je n'ai pas eu de chance de mettre doc.XmlResolver à null. Le correctif le plus simple pour moi consistait à utiliser un remplacement de chaîne pour remplacer "xmlns =" ​​par "ignore =" avant d'appeler LoadXml(), par exemple.

var responseText = await response.Content.ReadAsStringAsync(); 
responseText = responseText.Replace("xmlns=", "ignore="); 
try 
{ 
    var doc = new XmlDocument(); 
    doc.LoadXml(responseText); 
    ... 
}