我有一个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:PackageBinary'不能包含child 元素'http://www.w3.org/2004/08/xop/include:Include'因为 父元素的内容模型仅为文本。
这是有道理的,因为它不是base64的内容,但我认为这是常见的做法......?有没有办法在架构中支持这个? (我们现有的产品支持这种语法,但我们现在正在添加验证。)
答案 0 :(得分:0)
我能想到的最好的方法是创建一个允许任何标签的复杂类型,但也标记为“混合”,因此它允许文本。这并没有明确地将内容声明为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"/>
答案 1 :(得分:0)
我发现的解决方案是这样的:
<?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>
答案 2 :(得分:0)
我在xml文档中看到这个似乎允许验证 - 基本上属性xmlns:xop =&#34; ...&#34;做了诀窍:
<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 >