如果字符串元素包含有效 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>
我的理解是只有少数几个选择可以正确反序列化。
- 包装在 CDATA 中(嵌套的 cdata 呃)
- 更改架构以使用复杂类型而不是字符串,其中复杂类型引用其他 XSD 架构
- 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 重写为他们真正的意思,并让您自己和您的代码达到更高的标准(即 实际 标准)。任何其他事情都是黑客攻击,让你成为他们犯罪的帮凶。
我正在托管一个 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>
我的理解是只有少数几个选择可以正确反序列化。
- 包装在 CDATA 中(嵌套的 cdata 呃)
- 更改架构以使用复杂类型而不是字符串,其中复杂类型引用其他 XSD 架构
- 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 重写为他们真正的意思,并让您自己和您的代码达到更高的标准(即 实际 标准)。任何其他事情都是黑客攻击,让你成为他们犯罪的帮凶。