C# 调整xsd验证以部分忽略订单 我有一个应该经过xsd验证的xml查询…(不可能??)

C# 调整xsd验证以部分忽略订单 我有一个应该经过xsd验证的xml查询…(不可能??),c#,validation,xsd,schema,xsd-validation,C#,Validation,Xsd,Schema,Xsd Validation,不幸的是,xml的xsd模式包含两个序列之间的xsd:choice 但我在xml查询中指定了这两个序列。 这会导致xsd使xml失败,关于如何覆盖此检查的任何方向 提供: 1.XSD架构是标准化的&无法更改。 2.任何更改都必须在我应用验证的C#代码后面进行。 同样的问题也出现在: 但是答案是修改xsd模式,这是用户接受的答案 更新1 xml与此类似: ... <elem> <subElemA>textValA</subElemA> <

不幸的是,xml的xsd模式包含两个序列之间的xsd:choice

但我在xml查询中指定了这两个序列。 这会导致xsd使xml失败,关于如何覆盖此检查的任何方向

提供: 1.XSD架构是标准化的&无法更改。 2.任何更改都必须在我应用验证的C#代码后面进行。 同样的问题也出现在:

但是答案是修改xsd模式,这是用户接受的答案

更新1 xml与此类似:

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

很可能你正在尝试做的事情是不可能的。从验证器的角度来看,XML模式是您试图验证的契约。如果您的文档与该合同不一致,那么验证器将无法接受它(否则它将违反您要求它执行的操作)

如果您真的需要接受这个XML文档,那么您指示验证器接受它的方式就是更改它试图执行的契约(模式)。实现这一点的最佳方法是与您的第三方合作,帮助他们解决其模式和他们提供的实例文档之间的冲突。如果不这样做,任何其他试图履行合同的人都会遇到与你相同的问题


如果不可能,您可以通过创建本地模式文件绕过系统,该文件已被修改以允许验证实例文档。与其将客户模式加载到验证器中,不如加载替代实现。这将允许您验证文档,而无需第三方更新官方模式。这很容易变成一个维护问题,因为您的本地副本可能与原始架构中的更改不同步,但是如果他们不愿意更改此实例文档的架构,那么架构可能不会频繁更改。

xml是什么样子的?它可以被修改吗?@dblood当然可以修改,尽管我真的很欣赏xml通过验证的解决方案,根据您的描述,在包含了subElemA和subelemb之后,听起来好像您试图包含两个元素,其中模式调用为一(或零)。这听起来不像是一个排序问题,而是一个包含额外元素的问题。您能否提供一些详细信息,说明为什么您试图违反由模式建立的契约?我会假设,由于模式无法更改,您正在与某个第三方交互,如果您不符合他们建立的模式,他们可能无法解析您的文档。@DRH据我所知,您在这两个方面都是正确的,我相信我面临这个问题是因为额外的元素;第三方自己也问过我上面提到的问题,主要是我希望找到一个解决方案,其中包括调整我的模式验证代码,以允许模式验证器绕过此检查。我同意@DRH和他的回答,假设模式本身无法更改。如果第三方模式只调用一个元素,为什么xml中必须同时包含这两个元素?我想知道你的问题是否有一个符合模式的不同解决方案。你保留模式本地副本的想法对我来说是新的。尽管我的想法是确认是否有任何方法可以改变模式验证器(c#)来接受这个模式,如果&仅当它不可能=>时,我计划通知不正确的模式。但是我必须发布的原因是为了确保验证代码中的任何更改都不会允许使用该模式进行成功的验证,因为该模式是由一群非常彻底的人准备的。
...
<xsd:choice>
    <xsd:element name="subElemA" minOccurs="0" maxOccurs="1">
    </xsd:element>
    <xsd:element name="subElemB" minOccurs="0" maxOccurs="1">
    </xsd:element>
</xsd:choice>
...
   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());