2010-10-08 11 views
6

Mam usługę WWW, która przetwarza żądanie HTTP. Dokument, który otrzymuje, zawiera osadzony DOCTYPE, który określa plik .dtd. Chciałbym skorzystać z nowszego pliku sprawdzania poprawności schematu XML, utworzonego na wypadek, gdyby nowsze urządzenia łączyły się z moją usługą.Ignoruj ​​plik DOCTYPE .dtd, ale plik .dtd musi nadal istnieć

Mogę z powodzeniem zignorować sprawdzanie poprawności, które dzieje się w pliku .dtd, ale plik .dtd musi istnieć na moim lokalnym dysku twardym. Chcę usunąć te przestarzałe pliki i nie znalazłem sposobu.

dokument XML Próbka mam przetwarzania:

<?xml version="1.0" encoding="us-ascii" standalone="no"?> 
<!DOCTYPE SomeMessage SYSTEM "SomeMessage.dtd"> 
<SomeMessage>data</SomeMessage> 

funkcja, która używam, aby otworzyć dokument:

private void LoadXmlDoc(XmlTextReader myXmlTextReader) 
{ 
    XmlReaderSettings readerSettings = new XmlReaderSettings(); 
    readerSettings.ValidationType = ValidationType.Schema; 
    readerSettings.Schemas.Add(null, MyGoodSchemaFile); 
    readerSettings.DtdProcessing = DtdProcessing.Ignore; 
    readerSettings.XmlResolver = null; // Added as a test. 

    readerSettings.ValidationEventHandler += ValidationEventHandle; 
    XmlReader myXmlReader = XmlReader.Create(myXmlTextReader, readerSettings); 

    XmlDocument myXmlDocument = new XmlDocument(); 
    myXmlDocument.XmlResolver = null; // Added as a test. 
    myXmlDocument.Load(myXmlReader); // Exception thrown here! 
} 

tą różnicą, że jest złowionych:

 
System.IO.FileNotFoundException: Could not find file 'c:\windows\system32\inetsrv\SomeMessage.dtd'. 
File name: 'c:\windows\system32\inetsrv\SomeMessage.dtd' 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 

zawartość pliku SomeMessage.dtd nie jest używana - jest ignorowana, jak chcę. Jednak fikcyjny plik "c: \ windows \ system32 \ inetsrv \ SomeMessage.dtd" musi istnieć, w przeciwnym razie zostanie zgłoszony wyjątek.

Używam Windows 7, przy użyciu programu Visual Studio 2010 i .NET 4.0

Jak mogę ignorować osadzone .dtd a także nie wymagają obojętne plik .dtd być zainstalowany na moim komputerze?

+0

Jakie usługi internetowej jest? Home grown lub usługa sieciowa ASP.NET (.asmx)? Czy jest to klient usługi WWW, który szuka DTD? – Kev

+0

Jest to usługa .aspx, z plikiem .aspx.cs C#. Myślę jednak, że to nie ma znaczenia. Myślę, że każdy dokument XML odczytywany przez fragment kodu powyżej, który ma DOCTYPE z linią .dtd, będzie miał błąd bez względu na to, gdzie go uruchomisz. –

Odpowiedz

9

Rozwiązanie polega na ustawieniu XmlResolver XmlTextReader na wartość null. Zmiana XmlReaderSettings.XmlResolver = null nie pomaga, ani nie ustawiając XmlDocument.XmlResolver = null

Oto poprawiona funkcja:

+0

Uratowałeś mi życie! Opracowałem bibliotekę dll, która działa doskonale w formbased. Ale po podłączeniu go do aplikacji internetowej .NET, zawiesił się na dtd. Jest to potrzebne tylko podczas korzystania z aplikacji internetowych. Dzięki! – bert

Powiązane problemy