【发布时间】: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