2013-03-26 62 views
3

我有xml发送到网页,我想验证几个xsd,直到文件验证。验证后,我可以根据管理的验证模式来确定xml文件的类型。对多个模式验证未知的xml,直到找到匹配

List<string> xsdList = new List<string>(); 

    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Enquiry.xsd"); 
    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\FingerDeleted.xsd"); 
    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Heartbeat.xsd"); 
    xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Validation.xsd"); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 

    foreach (string schema in xsdList) 
    { 
    var reader = new StringReader(File.ReadAllText(schema)); 
    schemas.Add("", XmlReader.Create(reader)); 
    } 

    request.Validate(schemas, (o, e) => 
    { 
    match = false; 
    }); 

谁能帮助,上面是什么香港专业教育学院拼凑起来的,到目前为止,它目前抛出一个错误“System.Xml.Schema.XmlSchemaValidationException:全球元素‘接口’已经声明”

有没有一种方法可以获得返回哪个模式的valiation成功?

回答

4

首先,你必须弄清楚XSD文件可以放在一个文件集中。您收到的错误告诉您,相同的元素“界面”的定义来自两个或更多不同的基本URI。

如果您想动态确定这些设置,那么您需要做一些工作。这是可能的,但这不是微不足道的。它取决于XSD文件是否使用组合(包括/导入/重新定义)。如果它们不是(简单的场景),那么为了将XSD文件放在一起,您必须单独加载每个XSD文件,为所有全局定义的内容(类型,元素,组,属性,属性组)建立索引,然后放入将这些集合放在一起,使得给定集合中的任何一对单独的XSD成员,交集是空的。构建集合的策略取决于许多因素,性能和覆盖面只有两个。基于这种微不足道的情况,您可以看到组合的重要性,因为即使交叉点不是空的,因为如果公共内容来自同一个URI,所有意图都将被视为空。

QTAssistant(我与它关联)有一个完整的引擎来处理上述问题,以便为任何XSD内容“收集”用于分析时为其XML Schema重构引擎设置XML Schema源集(或集合) ,验证等。

一旦你确定了这些集合,就必须对这些模式的组成做出假设。换句话说,构成一组有效的XML文档元素(有时不是全部全局元素定义是有效的文档元素)以及应该为每个文档元素使用什么模式集。很明显,你必须以某种方式处理这个问题,因为你有重复的元素。

如果您想按照您的问题来处理它,那么只需循环遍历上面构造的一组模式集即可。

想出一个关于如何手动计算最佳设置的策略的最佳方法可能是可视化您的XSD文件之间的关系。下面是我如何使用可用的工具从SO的另一篇文章中看到它。

enter image description here

+0

谢谢你,这说明了一切。我对XSD验证的理解很有意义。 – DavidB 2013-03-26 13:39:06

1

http://msdn.microsoft.com/en-us/library/fe6y1sfe(v=vs.110).aspx

“架构在XmlSchemaSet中通过的XmlSchemaSet的编译方法编译成一个逻辑模式”

因此,要针对多个独立模式进行验证,您应该为每个XSD创建一个XmlSchemaSet

然后,你可以这样做:

bool xmlIsValid = true; 
XmlSchemaSet validatingSchema; 
foreach (XmlSchemaSet schema in schemas) { 
    xml.Validate(schema, (o, e) => { xmlIsValid = false; }); 
    if (xmlIsValid) { 
     validatingSchema = schema; 
     break; 
    } 
}