2011-01-21 80 views
0

我正在嘗試使用XmlReader和關聯的​​對象在某些文檔上執行XSD驗證。我聲明瞭一個ValidationEventHandler,我期望在讀者遇到驗證問題時會調用它。但是,當我嘗試創建閱讀器時,我得到XSDValidationException.NET XSD驗證混淆

任何想法會導致異常?消息是:

System.Xml.Schema.XmlSchemaValidationException:未聲明'http://www.w3.org/XML/1998/namespace:base'屬性。

對於其中一個底層模式會有問題嗎?

+0

什麼是整個例外(`ex.ToString()`)?它可能會告訴你行號和位置,甚至可能是文件名。 – 2011-01-21 23:31:28

回答

0

驗證您的實際XML文檔在沒有名稱空間中沒有根元素。

當您的模式驗證具有目標名稱空間,但正在驗證的XML文檔包含沒有名稱空間的任何根元素時,可能會出現此錯誤。

不幸的是,在這種情況下的模式驗證只會產生一個警告,即它沒有爲根元素找到匹配的模式,並且只有在設置了報告警告的特定標誌時纔會顯示此警告,驗證XmlDocument的方法。

0

在您的模式和文檔中搜索​​屬性。如果存在,那麼定義該屬性的模式將需要位於您的模式集中。

0

代碼示例本來很好,可以確定你在做什麼,但是我可以做出一些假設,因爲我在同一個地方。我遇到了Using XSDs with includes,並調整了我接受的答案。

問題是,XmlReader似乎不知道包含的模式的基本路徑是什麼,如果您沒有指定它,而Create()XmlReader。假設您有一個到您的XML文件的文件路徑,請使用XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri)並將XML文件的路徑作爲baseUri

例子:

using System.IO; 
using System.Xml; 
using System.Xml.Schema; 

public void LoadXml(string path) { 
    XmlDocument doc = new XmlDocument(); 
    XmlReader docReader; 

    XmlReaderSettings rdrOpts = new XmlReaderSettings(); 
    rdrOpts.ValidationType = ValidationType.Schema; 
    rdrOpts.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation; 

    try { 
     // This line is what you're looking for: 
     docReader = XmlReader.Create(new FileStream(path, FileMode.Open, FileAccess.Read), rdrOpts, Path.GetDirectoryName(path)); 
     doc.Load(docReader); 
    } catch (System.Xml.Schema.XmlSchemaValidationException ex) { 
     //... 
    } //and catch any other relevant exceptions here, like System.IO.FileNotFoundException 
}