4

我有一个 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”不能包含子元素“ http://www.w3.org/2004/08/xop/include:Include ”,因为父元素的内容模型仅为文本。

这是有道理的,因为它不是 base64 内容,但我认为这是常见的做法......?有没有办法在架构中支持这一点?(我们有支持这种语法的现有产品,但我们现在正在添加验证。)

4

3 回答 3

1

我找到的解决方案是这样的:

<?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>
于 2014-05-13T10:02:39.003 回答
1

我能想到的最好的方法是创建一个允许任何标签但也被标记为“混合”的复杂类型,因此它允许文本。这并没有明确地将内容声明为 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-01-09T17:06:33.303 回答
-1

我在一个似乎允许验证的 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 >
于 2016-04-06T13:43:03.893 回答