2010-12-14 20 views
11

almasını ben kodu (C#) aşağıdakilere sahip, uzun zaman alır ve istisna atar: Ben bunu yapmaz anlamak.NET: önle XmlDocument.LoadXml DTD

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

. Sorum şu ki onu nasıl durduracağım? DTD doğrulamasını umursamıyorum. Sanırım tekrar değiştirebilirim ama daha zarif bir çözüm arıyorum.

Arka plan:
Gerçek XML, sahip olmadığım bir web sitesinden alındı. Site bakım aşamasındayken, bakım sırasında mevcut olmayan DTD'yi işaret eden DOCTYPE ile XML döndürür. Bu yüzden hizmetim gereksiz yavaşlıyor çünkü ayrıştırmamız gereken her bir XML için DTD'yi almaya çalışıyor.

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 

cevap

10

Eh, .NET 4.0 XmlTextReader DtdProcessing adlı bir özelliğe sahiptir: Burada

durum yığın olduğunu. DtdProcessing.Ignore için ayarlandığında DTD işleme devre dışı bırakılmalıdır. .net 4.5.1 yılında

+0

nasıl .net 3.5 hakkında? –

+0

XmlReader.Settings.ValidationType öğesini ValidationType.None olarak ayarlamayı denemelisiniz. Alternatif olarak, XmlReader.Settings.XmlResolver öğesinin null olarak ayarlanmasının da hile –

+13

Doğrulanmış 'doc.XmlResolver = null işlevini ayarlayabileceğini düşünüyorum. –

0

Ben doc.XmlResolver null ayarını hiç şans vardı.

benim için en kolay düzeltme LoadXml(), örneğin çağırmadan önce "görmezden =" için "xmlns =" ​​değiştirmek için bir dize değiştirme kullanmaktı

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