【问题标题】:Tweak xsd validation to partially ignore order调整 xsd 验证以部分忽略顺序
【发布时间】:2012-02-21 14:26:32
【问题描述】:

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

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

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

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

提供:

1。 XSD 架构是标准化的,无法更改。

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

同样的问题:

Ignore element order while validating XML against XSD

但那里的答案是修改 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());

【问题讨论】:

  • xml 是什么样的?可以修改吗?
  • @dblood 确定它可以修改,虽然我真的很感激 xml 通过验证的解决方案,在包括 subElemA 和 subElemB 之后
  • 根据您的描述,听起来您正试图在架构调用一个(或零)的情况下包含两个元素。这听起来不像是订购问题,而是额外元素的问题。你能否提供一些关于你为什么试图违反模式建立的合同的细节?我会假设由于架构无法更改,因此您正在与某些第三方进行交互,并且如果您不符合他们建立的架构,他们可能无法解析您的文档。
  • @DRH 据我所知,您在这两个帐户上的权利,我相信由于额外的元素,我正面临这个问题;第三方自己也问过我上面提到的问题,主要是我希望找到一个解决方案,包括调整我的模式验证代码以允许模式验证器绕过这个检查。
  • 我同意@DRH 和他的回答,假设架构本身不能更改。如果第 3 方架构只需要一个元素,为什么必须在 xml 中同时拥有这两个元素?我想知道您的问题是否有其他符合架构的解决方案。

标签: c# validation xsd schema xsd-validation


【解决方案1】:

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

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

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

【讨论】:

  • 您保留模式的本地副本的想法对我来说是新的。尽管我的想法是确认是否有任何方法可以更改模式验证器(c#)以接受此模式,但如果 & 仅在不可能的情况下 => 那么我计划通知不正确的模式。但我必须发布的原因是确保验证代码的任何更改都不会允许使用此架构成功验证,因为此架构是由一群非常彻底的人准备的。
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2020-07-28
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多