2010-10-08 74 views
6

我有一個處理HTTP請求的Web服務。它收到的文檔具有指定.dtd文件的嵌入式DOCTYPE。我希望使用更新的XML模式驗證文件,以便在新設備連接到我的服務時進行驗證。忽略DOCTYPE .dtd,但.dtd文件必須仍然存在

我可以成功忽略在.dtd文件中進行的驗證,但.dtd文件必須存在於本地硬盤上。我想刪除這些過時的文件,並沒有找到方法。

示例XML文檔,我的處理:

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

,我使用打開的文檔的功能:

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! 
} 

不同之處在於捕捉:

 
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) 

的SomeMessage.dtd文件的內容沒有被使用 - 它被忽略,因爲我的願望。但是,虛擬文件​​「c:\ windows \ system32 \ inetsrv \ SomeMessage.dtd」必須存在,否則將拋出異常。

我在Windows 7上運行,使用Visual Studio 2010和.NET 4.0

我怎麼能夠無視嵌入式.dtd,也並不需要虛擬.dtd文件被我的電腦上安裝?

+0

什麼樣的Web服務的這是什麼?自家種植的還是ASP.NET Web服務(.asmx)?它是尋找DTD的Web服務客戶端嗎? – Kev 2010-10-08 21:21:00

+0

它是一個.aspx服務,帶有.aspx.cs C#文件。不過,我認爲這不重要。我認爲任何由上面的代碼片段讀取的具有.dtd行的DOCTYPE的XML文檔都會有錯誤,無論您在哪裏執行它。 – 2010-10-08 22:13:24

回答

9

解決方法是將基礎XmlTextReader的XmlResolver設置爲null。更改XmlReaderSettings.XmlResolver = NULL沒有幫助,也沒有設置XmlDocument.XmlResolver = NULL

這裏是修正功能:

+0

你救了我的命!我開發了一個可以完美工作的dll。但將它附加到.NET Web應用程序後,它在dtd上崩潰。所以這隻在使用web應用時才需要。謝謝! – bert 2017-03-24 14:54:48