我有一个XML,它定义了一个元素,可以是base64文本,也可以是xop:Include元素。目前,这被定义为一个base64Binary类型:
<xs:element name="PackageBinary" type="xs:base64Binary" minOccurs="1" maxOccurs="1"/>当我插入xop:Include元素时,它看起来如下所示:
<PackageBinary>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="http://google.com/data.bin" />
</PackageBinary>但是这会产生一个XML验证错误(我使用的是.NET验证器):
元素‘mds:xml-schema:soap11 11:PackageBinary’不能包含子元素'http://www.w3.org/2004/08/xop/include:Include‘,因为父元素的内容模型仅为文本。
这是合理的,因为它不是base64内容,但我认为这是常见的做法.?是否有任何方法在架构中支持这一点?(我们有支持这种语法的现有产品,但我们现在正在添加验证。)
发布于 2014-01-09 17:06:33
我能想到的最好的方法是创建一个复杂的类型,它允许任何标记,但也被标记为“混合”,因此它允许文本。这并不会显式地将内容声明为base64,但它确实让它通过了验证。
<xs:complexType name="PackageBinaryInner" mixed="true">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:element name="PackageBinary" type="PackageBinaryInner" minOccurs="1" maxOccurs="1"/>发布于 2014-05-13 10:02:39
我找到的解决办法如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://example.org"
elementFormDefault="qualified"
xmlns="http://example.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xop="http://www.w3.org/2004/08/xop/include">
<xs:import namespace="http://www.w3.org/2004/08/xop/include"
schemaLocation="http://www.w3.org/2004/08/xop/include"/>
<xs:complexType name="PackageBinary" mixed="true">
<xs:all>
<xs:element ref="xop:Include"/>
</xs:all>
</xs:complexType>发布于 2016-04-06 13:43:03
我在一个似乎允许验证的xml文档中看到了这一点--基本上是属性xmlns:xop=“.”做了个小把戏:
<SomeElement xmlns:xop="http://www.w3.org/2004/08/xop/include/" id="465390" type="html">
<SomeElementSummaryURL>https://file.someurl.com/SomeImage.html</SomeElementSummaryURL>
<xop:Include href="cid:1111111@someurl.com"/>
</SomeElement >https://stackoverflow.com/questions/20909580
复制相似问题