2011-01-10 38 views
5

使用c#和.net 3.5我試圖根據包含的模式驗證xml文檔。xmldocument和嵌套模式

的模式和有包括如以下

Schema1.xsd - >包括another.xsd

another.xsd - >包括base.xsd

當我嘗試添加Schema1。 xsd到XmlDocument我得到以下錯誤。

類型'YesNoType'未聲明或不是簡單類型。

我相信我得到這個錯誤,因爲當我加載Schema1.xsd模式時沒有包含base.xsd文件。

我想使用XmlSchemaSet類,並將XmlResolver URI設置爲模式的位置。

注:所有模式生活在同一目錄e下:\開發\ MAIN \ XmlSchemas

下面是代碼

string schemaPath = "E:\\Dev\\Main\\XmlSchemas"; 

XmlDocument xmlDocSchema = new XmlDocument(); 

XmlSchemaSet s = new XmlSchemaSet(); 

XmlUrlResolver resolver = new XmlUrlResolver(); 

Uri baseUri = new Uri(schemaPath); 

resolver.ResolveUri(null, schemaPath); 

s.XmlResolver = resolver; 

s.Add(null, XmlReader.Create(new System.IO.StreamReader(schemaPath + "\\Schema1.xsd"), new XmlReaderSettings { ValidationType = ValidationType.Schema, XmlResolver = resolver }, new Uri(schemaPath).ToString())); 


xmlDocSchema.Schemas.Add(s); 

ValidationEventHandler valEventHandler = new ValidationEventHandler 
(ValidateNinoDobEvent); 

try 
{ 
xmlDocSchema.LoadXml(xml); 
xmlDocSchema.Validate(valEventHandler); 
} 
catch (XmlSchemaValidationException xmlValidationError) 
{ 
// need to interogate the Validation Exception, for possible further 
// processing. 
string message = xmlValidationError.Message; 
return false; 
} 

任何人都可以點我在正確的方向就針對驗證一個XmlDocument包含嵌套的模式。

+0

順便說一句,有沒有這樣的事情,C#.NET – 2011-01-10 14:52:54

回答

0

認爲,你需要做的是要合併的模式:

http://asp.dotnetheaven.com/howto/doc/Xml/MultipleSchemas.aspx

如果他們嵌套,即意味着你將需要在層次結構的底部,以start並按順序加載它們。我不是100%確定的,因爲我能夠找到的樣本嚴格來說沒有嵌套結構,而是互補結構。祝你好運。

1

我也有一個嵌套模式的情況下,我沒有發現驗證中的任何錯誤。我的代碼看起來像follwoing。

private string strLogger = null; 
    public bool ValidateXml(string path2XMLFile, string path2XSDFile) 
    { 
     bool isValidFile = false; 
     try 
     { 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ValidationType = ValidationType.Schema; 
      settings.Schemas.Add(null, path2XSDFile); 
      settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler); 
      XmlReader reader = XmlReader.Create(path2XMLFile, settings); 
      while (reader.Read()) ; 
      if (String.IsNullOrEmpty(strLogger)) 
      { 
       isValidFile = true; 
      }     
     } 
     catch (Exception ex) 
     { 
      LoggingHandler.Log(ex); 
     } 
     return isValidFile; 
    } 
    private void settings_ValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     strLogger += System.Environment.NewLine + "Validation Error Message = [" + e.Message + "], " + "Validation Error Severity = [" + e.Severity + "], " + System.Environment.NewLine; 
    }