调整xsd验证以部分忽略顺序

时间:2012-01-29 11:48:32

标签: c# validation xsd schema xsd-validation

我有一个xml查询,应该是xsd验证的...(不可能??)

  

不幸的是,xml的xsd架构包含两个序列之间的xsd:选项。

但是我在xml查询中指定了这两个序列。

这导致xsd使xml失败,关于我如何覆盖此检查的任何方向?

本发明提供:

1。 XSD架构是标准化的&不能改变。

2。必须在我应用验证的C#代码处进行任何更改。

同样的问题是:

Ignore element order while validating XML against XSD

但答案是修改xsd架构,这是用户接受的答案。

UPDATE1

xml与此类似:

...
<elem>
    <subElemA>textValA</subElemA>
    <subElemB>textValA</subElemB>
<elem>
...

但是XSD说:

...
<xsd:choice>
    <xsd:element name="subElemA" minOccurs="0" maxOccurs="1">
    </xsd:element>
    <xsd:element name="subElemB" minOccurs="0" maxOccurs="1">
    </xsd:element>
</xsd:choice>
...

&安培;如果我要从xml中删除subElemA或subElemB,那么xml将成功验证模式。

UPDATE2

我希望找到一个解决方案,其中包括调整我的架构验证代码以允许架构验证器绕过此检查;架构验证代码:

   XmlReaderSettings setting = new XmlReaderSettings();
   setting.ConformanceLevel = ConformanceLevel.Document;
   setting.IgnoreComments = true;
   setting.IgnoreWhitespace = true;
   setting.IgnoreProcessingInstructions = true;
   setting.ValidationType = ValidationType.Schema;
   setting.Schemas.Add(defaultNameSpace, schemaLocation.AbsoluteUri);
   setting.ValidationEventHandler += new ValidationEventHandler(this.SchemaValidationCallBack);
   MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xmlToValidate));
   XmlReader reader = XmlReader.Create(ms, setting);
   while (reader.Read());

1 个答案:

答案 0 :(得分:2)

您尝试做的事情很可能是不可能的。从验证器的角度来看,XML模式是您尝试验证的合同。如果您的文档与该合同不一致,则验证者不能接受它(否则它将违背您要求它做的事情)。

如果您确实需要接受此XML文档,那么指示验证程序接受它的方式是更改其尝试强制执行的协议(架构)。实现此目标的最佳方法是与您的第三方合作,帮助他们解决模式与他们提供的实例文档之间的冲突。如果不这样做,任何试图履行合同的人都会遇到同样的问题。

如果无法做到这一点,您可以通过创建已修改的本地模式文件来绕过系统,以允许验证实例文档。而不是将客户架构加载到验证器中,而是加载备用实现。这将允许您在没有第三方更新官方模式的情况下验证文档。这可能很容易变成维护问题,因为本地副本可能与原始架构中的更改不同步,但是如果他们不愿意更改此实例文档的架构,则架构可能不会更改经常是。