2016-08-19 3 views
0

У меня есть XML-файл, который нужно читать, и это выглядит примерно так:ОШИБОК S4S-ATT-не разрешенному: Атрибут «тип» не может появиться в элементе «элемент»

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

ответ

0

Ошибка в том, что вы не можете иметь @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> 
+0

Благодарим за это, уровень 3 работает как шарм. К сожалению, как вы сказали, уровни 1 и 2 беспорядочны. Я заканчиваю «List content», и описание смешивается с дополнительными уровнями. – buzzsawddog