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
qu'en est-il de .net 3.5? –
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 –
Confirmé 'doc.XmlResolver = null;' résout le problème. –