ОШИБКА s4s-att-not-allowed: атрибут «тип» не может отображаться в элементе «элемент»

У меня есть файл 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>

At build time I am using xjc to generate my classes for me.

<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>

When I try to add a type="xs:string" to any of my <xs:element> for example <xs:element ref="level1" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>

Он жалуется [ERROR] s4s-att-not-allowed: Attribute 'type' cannot appear in element 'element'.


person buzzsawddog    schedule 19.08.2016    source источник


Ответы (1)


Ошибка заключается в том, что вы не можете использовать @ref и @type для одного и того же элемента <xs:element>.

<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>
person Michael Kay    schedule 19.08.2016
comment
Спасибо за это, уровень 3 работает как шарм. К сожалению, как вы сказали, уровень 1 и 2 грязные. Я получаю List<Object> content, а описание смешивается с подуровнями. - person buzzsawddog; 22.08.2016