0

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

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

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

这导致 xsd 无法通过 xml,关于我如何覆盖此检查的任何指示?

假如:

1. XSD 架构是标准化的,不能更改。

2. 任何更改都必须在我应用验证的 C# 代码中完成。

同样被问到:

在针对 XSD 验证 XML 时忽略元素顺序

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

更新1

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 将成功验证架构。

更新2

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

   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());
4

1 回答 1

2

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

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

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

于 2012-01-31T05:35:37.443 回答