ERROR s4s-att-not-allowed:属性' type'不能出现在元素'元素中

时间:2016-08-19 20:21:20

标签: java xml jaxb xjc

我有一个我需要阅读的XML文件,它看起来与此类似:

<container time="">
<level1 id="1:0:0" name="Some Name">level1 Description
    <level2 id="1:1:0" name="Some Name">level2 Description
        <level3 id="1:1:1" name="Some Name">level3 Description</level3>
        <level3 id="1:1:2" name="Some Name">level3 Description</level3>
    </level2>
</level1>

在构建时,我正在使用xjc为我生成课程。

<javac includeantruntime="false" srcdir="${build.dir}/configuration_src"
  destdir="${build.dir}/generated_jars"
  classpathref="example.jars"
  debug="on">
  <include name="**"/>
</javac>

我遇到的问题是<level1>有描述但它也有0 to many <level2>。如何设置我的架构以便处理描述?

<xs:schema targetNamespace="http://example.com/container" xmlns="http://example.com/container" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="container">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="level1" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="level1">
    <xs:complexType>
        <xs:sequence>
          <xs:element ref="level2" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"></xs:attribute>
        <xs:attribute name="name" type="xs:string"></xs:attribute>
    </xs:complexType>
</xs:element>
<xs:element name="level2">
    <xs:complexType>
        <xs:sequence>
          <xs:element ref="level3" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"></xs:attribute>
        <xs:attribute name="name" type="xs:string"></xs:attribute>
    </xs:complexType>
</xs:element>
<xs:element name="level3">
    <xs:complexType>
        <xs:attribute name="id" type="xs:string"></xs:attribute>
        <xs:attribute name="name" type="xs:string"></xs:attribute>
    </xs:complexType>
</xs:element>

例如,当我尝试向type="xs:string"的任何<xs:element>添加<xs:element ref="level1" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>[ERROR] s4s-att-not-allowed: Attribute 'type' cannot appear in element 'element'.

抱怨{{1}}

1 个答案:

答案 0 :(得分:1)

错误是你不能在同一个<xs:element>元素上使用@ref和@type。

<xs:element>可以是元素声明,在这种情况下,它具有@name属性,也可以具有@type属性;或者它是对元素声明的引用,在这种情况下它具有@ref属性而没有@type。该类型属于元素声明;如果您指的是在其他地方声明的元素,那么该类型将使用该元素声明,而不是引用。

level3元素是具有简单内容的复杂类型。您声明它的方式通常是

<xs:element name="level3">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="id" type="xs:string"></xs:attribute>
        <xs:attribute name="name" type="xs:string"></xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

level1和level2元素更难。它们同时具有文本节点和元素节点子节点。在XSD中描述此内容的唯一方法是使用“混合内容”类型,但混合内容类型主要是为叙述性文本文档设计的,它们不能限制文本的去向或采用的形式。它可能看起来像这样:

<xs:element name="level2">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element ref="level3" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string"></xs:attribute>
    <xs:attribute name="name" type="xs:string"></xs:attribute>
  </xs:complexType>
</xs:element>