如果字符串元素包含有效 XML,是否需要 CDATA validate/deserialize 针对模式

Is CDATA required to validate/deserialize against a schema if a string element contains valid XML

我正在托管一个 C# WCF SOAP,该服务的调用包含以下元素

<element name="SomeXmlElement" type="xsd:string" minOccurs="0"/>

有问题的 WSDL 由客户端提供。

这个元素的内容是有效的XML,通常会符合不同的XSD,但对于我们的目的来说是任意有效的XML

如果数据通过"raw"客户端喜欢的方式发送,SomeXmlElement反序列化后为null

<SomeXmlElement><SomeArbitraryXml/></SomeXmlElement>

如果我让他们将其包装在 CDATA 中,它可以正常工作,但是 customer/client 抱怨他们不必为其他实现这样做,这会导致兼容性问题

<SomeXmlElement><![CDATA[<SomeArbitraryXml/>]]></SomeXmlElement>

我的理解是只有少数几个选择可以正确反序列化。

  1. 包装在 CDATA 中(嵌套的 cdata 呃)
  2. 更改架构以使用复杂类型而不是字符串,其中复杂类型引用其他 XSD 架构
  3. xs:架构中的任何(这将反序列化为什么?)

客户坚持认为这只是我的代码/.Net 中的一个缺陷,在原始格式中应该deserialize/process没问题。

滚动我自己的反序列化器是可能的,或者只是加载到 DOM 并访问 InnerXml 属性 或诸如此类的东西,但是要覆盖默认的预期行为 imo 需要做很多工作。

想法?建议?我是否正确解释了 XML 规范?有没有不需要更改架构或重写大量 WCF 默认行为的选择?

您的客户无权抱怨。他们正在发布一个接口,然后带外告诉您忽略接口规范的部分内容。

如果他们想在 SomeXmlElement 下允许任意 XML,那么他们应该使用 xsd:any

如果他们想将 SomeXmlElement 下的 XML 限制为另一个 XSD 给出的,那么他们应该 import or include 另一个 XSD 并且明确引用允许的元素。

但是他们不应该指定 SomeXmlElement 包含一个 xsd:string 然后期望它的内容模型真的是 XML。 你才是有权抱怨的人。


他们的实施已有 10 年历史或基于 Java 是无关紧要的。 XML 和 XSD 规范可以追溯到那么远,并且在 Java 中运行良好。

因此,除了在这里寻找验证之外,您可能还需要一些建议,而不是告诉您的客户修复他们损坏的接口定义...

考虑将他们的 XSD 重写为他们真正的意思,并让您自己和您的代码达到更高的标准(即 实际 标准)。任何其他事情都是黑客攻击,让你成为他们犯罪的帮凶。