不幸的是,xml的xsd架构包含两个序列之间的xsd:选项。
这导致xsd使xml失败,关于我如何覆盖此检查的任何方向?
同样的问题是:
Ignore element order while validating XML against XSD
但答案是修改xsd架构,这是用户接受的答案。
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将成功验证模式。
我希望找到一个解决方案,其中包括调整我的架构验证代码以允许架构验证器绕过此检查;架构验证代码:
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());
答案 0 :(得分:2)
您尝试做的事情很可能是不可能的。从验证器的角度来看,XML模式是您尝试验证的合同。如果您的文档与该合同不一致,则验证者不能接受它(否则它将违背您要求它做的事情)。
如果您确实需要接受此XML文档,那么指示验证程序接受它的方式是更改其尝试强制执行的协议(架构)。实现此目标的最佳方法是与您的第三方合作,帮助他们解决模式与他们提供的实例文档之间的冲突。如果不这样做,任何试图履行合同的人都会遇到同样的问题。
如果无法做到这一点,您可以通过创建已修改的本地模式文件来绕过系统,以允许验证实例文档。而不是将客户架构加载到验证器中,而是加载备用实现。这将允许您在没有第三方更新官方模式的情况下验证文档。这可能很容易变成维护问题,因为本地副本可能与原始架构中的更改不同步,但是如果他们不愿意更改此实例文档的架构,则架构可能不会更改经常是。