【发布时间】:2023-03-23 07:25:01
【问题描述】:
我有一个基本的 XML 模式,我必须使用 xs:redefine 对其进行扩展,然后从第二个模式添加一些扩展。当我解组时遇到致命错误: cvc-complex-type.2.4.d:发现以元素“base:TypeTwo”开头的无效内容。此时不应有子元素。 即使其他解析器说 XML 完全有效。
- 所以我在命名空间下的 base.xsd 中有我的基本标签 "http://www.example.com/base"
- 我在 extension.xsd 中的扩展标签 在命名空间“http://www.example.com/extension”下
- 还有我的 在redefine.xsd中重新定义,导入extension.xsd
所以我的基本标签是
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element ref="TypeThree" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TypeTwo">
</xs:complexType>
<xs:element name="TypeTwo" type="TypeTwo" />
<xs:group name="TypeThreeExtension">
<xs:sequence />
</xs:group>
<xs:complexType name="TypeThree">
<xs:sequence>
<xs:group maxOccurs="unbounded" minOccurs="0" ref="TypeThreeExtension" />
</xs:sequence>
</xs:complexType>
<xs:element name="TypeThree" type="TypeThree" />
只有一个根和两个元素,一个带有一个用于扩展的组。
我的扩展标签是:
<xs:schema targetNamespace="http://www.example.com/extension"
elementFormDefault="qualified"
xmlns="http://www.example.com/extension"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:base="http://www.example.com/base"
xmlns:ext="http://www.example.com/extension"
>
<xs:import schemaLocation="base.xsd" namespace="http://www.example.com/base"/>
<xs:complexType name="ExtTypeOne">
<xs:sequence>
<xs:element ref="base:TypeTwo" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:element name="ExtTypeOne" type="ExtTypeOne" />
所以只有一种附加类型,它包含 base 类型之一(这似乎是重要因素)。
redefine.xsd 是
<xs:schema targetNamespace="http://www.example.com/base"
elementFormDefault="qualified" xmlns="http://www.example.com/base"
xmlns:ext="http://www.example.com/extension" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import schemaLocation="extension.xsd" namespace="http://www.example.com/extension" />
<xs:redefine schemaLocation="base.xsd">
<xs:group name="TypeThreeExtension">
<xs:sequence>
<xs:element ref="ext:ExtTypeOne" maxOccurs="unbounded" />
</xs:sequence>
</xs:group>
</xs:redefine>
所以这里我只是扩展了基本的 TypeThreeExtension 组,以便我现在可以在下面添加 ExtTypeOne 标记。这基本上允许标签的结构是:
- 基地
- 分机
- 基础
- 分机
当我加载以下 XML 进行解组时...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root
xmlns="http://www.example.com/base"
xmlns:base="http://www.example.com/base"
xmlns:ext="http://www.example.com/extension">
<TypeThree>
<ext:ExtTypeOne>
<base:TypeTwo/>
</ext:ExtTypeOne>
</TypeThree>
</Root>
我收到以下错误:
ValidationEvent 1 - 行:8,严重性:2,cvc-complex-type.2.4.d:发现以元素“base:TypeTwo”开头的无效内容。此时不需要子元素。
无论我做什么,我都无法摆脱这个错误。事实上 - 即使我将对象 编组 到 XML 中,JAXB 实际上会创建 XML,然后它(在解组时)报告是无效的。这是一个 JAXB 错误吗?
FWIW - 我可以说它是导致它的 base-ext-base 嵌套。将重新定义的模式中的类型嵌套在第二个模式的标记下是否无效?我需要创建不同的目标命名空间吗?
这可要了我的命……
【问题讨论】:
标签: xml jaxb xml-namespaces jaxp