使用c#和.net 3.5我正在尝试针对包含的模式验证xml文档。
模式及其中包括如下
Schema1.xsd - >包括another.xsd
another.xsd - >包括base.xsd
当我尝试将Schema1.xsd添加到XmlDocument时,我收到以下错误。
未声明类型“YesNoType”或不是简单类型。
我相信我收到此错误是因为在加载Schema1.xsd架构时没有包含base.xsd文件。
我正在尝试使用XmlSchemaSet类,并且我将XmlResolver uri设置为模式的位置。
注意:所有模式都位于同一目录E:\ Dev \ 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 :(得分:1)
我也有一个嵌套的架构案例,我在验证时没有发现任何错误。我的代码看起来像下面一样。
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;
}
答案 1 :(得分:0)
我认为您需要做的是合并模式:
http://asp.dotnetheaven.com/howto/doc/Xml/MultipleSchemas.aspx
如果它们是嵌套的,那意味着您需要从层次结构的底部开始并按顺序加载它们。我不是百分百肯定,因为我能找到的样本严格来说没有嵌套结构,而是互补结构。祝你好运。