.NET: предотвратить XmlDocument.LoadXml от получения DTD - PullRequest
12 голосов
/ 15 декабря 2010

У меня следующий код (C #), он занимает слишком много времени и выдает исключение:

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

Я понимаю, почему это так. Мой вопрос: как мне остановить это? Меня не волнует проверка DTD. Полагаю, я мог бы просто заменить его на регулярное выражение, но я ищу более элегантное решение.

Справочная информация:
Фактический XML получен с веб-сайта, которым я не владею. Когда сайт проходит техническое обслуживание, он возвращает XML с DOCTYPE, который указывает на DTD, который не доступен во время обслуживания. Так что мой сервис становится ненужным медленным, потому что он пытается получить DTD для каждого XML, который мне нужно проанализировать.

Вот стек исключений:

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

Ответы [ 2 ]

10 голосов
/ 16 декабря 2010

Ну, в .NET 4.0 XmlTextReader имеет свойство, называемое DtdProcessing.Если установлено значение DtdProcessing.Ignore, следует отключить обработку DTD.

1 голос
/ 06 июля 2016

В .net 4.5.1 мне не повезло, установив doc.XmlResolver в null.

Самым простым решением для меня было использование замены строки, чтобы изменить "xmlns =" ​​на "ignore =" перед вызовом LoadXml (), например,

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