Invalid XML Schema - [s4s-elt-invalid-content.1:]

I am having trouble validating my XML schema. My kod scheme:

<?xml version="1.0" encoding="utf-8"?> 

  <xsd:element name="colection"> <xsd:complexType> <xsd:sequence> <xsd:element name="author" type="TypAuthor" maxOccurs="1"/> <xsd:element name="books" type="TypBooks"/> <xsd:element name="films" type="TypFilms"/> <xsd:element name="copyright" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="TypAuthor"> <xsd:sequence> <xsd:element name="name" type="xsd:string" maxOccurs="1"/> <xsd:element name="surname" type="xsd:string"/> <xsd:element name="gender" type="TypSex"/> <xsd:element name="age" type="xsd:integer"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="country" type="xsd:string"/> <xsd:element name="study" type="xsd:string"/> <xsd:element name="semester" type="xsd:integer"/> <xsd:element name="group" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="TypSex"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="male"/> <xsd:enumeration value="female"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="TypBooks"> <xsd:sequence> <xsd:element name="book" type="TypBook" minOccurs="5" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypBook"> <xsd:attribute name="nr" type="TypNr" /> <xsd:attribute name= "lang" type="TypLang"/> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="author" type="TypAuthor2"/> <xsd:element name="genre" type="xsd:string"/> <xsd:element name="pages" type="xsd:integer"/> <xsd:element name="year" type="xsd:integer"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypAuthor2"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="country" type="TypCountry2" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="TypCountry2"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="USA"/> <xsd:enumeration value="PL"/> <xsd:enumeration value="UK"/> <xsd:enumeration value="FR"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="TypNr"> <xsd:restriction base="xsd:integer"> <xsd:maxInclusive value="5"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="TypLang"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="pl"/> <xsd:enumeration value="en"/> <xsd:enumeration value="fr"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="TypFilms"> <xsd:sequence> <xsd:element name="film" type="TypFilm" minOccurs="5" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypFilm"> <xsd:attribute name="nr" type="TypNr" /> <xsd:attribute name= "lang" type="TypLang"/> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="director" type="TypDirector"/> <xsd:element name="year" type="xsd:integer"/> <xsd:element name="genre" type="xsd:string"/> <xsd:element name="stars" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypDirector"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="country" type="TypCountry2" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> 

The error message I get is the following:

s4s-elt-invalid-content.1: "TypBook" content is invalid. The complexContent element is invalid, inappropriate, or occurs too often.

s4s-elt-invalid-content.1: Content "TypFilm" is invalid. The complexContent element is invalid, inappropriate, or occurs too often.

Do you have any suggestions? I need to send this valid circuit to my Profesor before 11pm. Please, help!

Thank you very much

+4
source share
3 answers

This is a very bad error message, but as Larsson says, attributes must be defined after the content.

If you cannot find such a rule in the prose of the specification, probably in the schema for schema documents, which is a normative part of the specification.

+6
source

I think your problem is with the sequence preceding the attributes, try the following: I spent a couple of minutes trying too google the source for this rule, but did not find much. However, in w3Shools complex type docs syntax is specified with the latest attributes. Not very explicit though.

 <?xml version="1.0" encoding="utf-8"?> <xsd:schema id="XMLSchema1" targetNamespace="http://tempuri.org/XMLSchema1.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema1.xsd" xmlns:mstns="http://tempuri.org/XMLSchema1.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="colection"> <xsd:complexType> <xsd:sequence> <xsd:element name="author" type="TypAuthor" maxOccurs="1"/> <xsd:element name="books" type="TypBooks"/> <xsd:element name="films" type="TypFilms"/> <xsd:element name="copyright" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="TypAuthor"> <xsd:sequence> <xsd:element name="name" type="xsd:string" maxOccurs="1"/> <xsd:element name="surname" type="xsd:string"/> <xsd:element name="gender" type="TypSex"/> <xsd:element name="age" type="xsd:integer"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="country" type="xsd:string"/> <xsd:element name="study" type="xsd:string"/> <xsd:element name="semester" type="xsd:integer"/> <xsd:element name="group" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="TypSex"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="male"/> <xsd:enumeration value="female"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="TypBooks"> <xsd:sequence> <xsd:element name="book" type="TypBook" minOccurs="5" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypBook"> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="author" type="TypAuthor2"/> <xsd:element name="genre" type="xsd:string"/> <xsd:element name="pages" type="xsd:integer"/> <xsd:element name="year" type="xsd:integer"/> </xsd:sequence> <xsd:attribute name="nr" type="TypNr" /> <xsd:attribute name= "lang" type="TypLang"/> </xsd:complexType> <xsd:complexType name="TypAuthor2"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="country" type="TypCountry2" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="TypCountry2"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="USA"/> <xsd:enumeration value="PL"/> <xsd:enumeration value="UK"/> <xsd:enumeration value="FR"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="TypNr"> <xsd:restriction base="xsd:integer"> <xsd:maxInclusive value="5"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="TypLang"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="pl"/> <xsd:enumeration value="en"/> <xsd:enumeration value="fr"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="TypFilms"> <xsd:sequence> <xsd:element name="film" type="TypFilm" minOccurs="5" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TypFilm"> <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="director" type="TypDirector"/> <xsd:element name="year" type="xsd:integer"/> <xsd:element name="genre" type="xsd:string"/> <xsd:element name="stars" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="nr" type="TypNr" /> <xsd:attribute name= "lang" type="TypLang"/> </xsd:complexType> <xsd:complexType name="TypDirector"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="country" type="TypCountry2" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:schema> 
+1
source

You can change the xsd element definition order. For example, given the following scenario

 <xsd:complexType name="Element-A> <xsd:attribute name="attribute1" type="xsd:string" use="required" /> <xsd:attribute name="attribute2" type="xsd:int" use="required" /> </xsd:complexType> 

Now, in this case, if you want to add an attribute, you can add ONLY AT THE BEGINNING. In addition, you must surround it with an attribute. Thus, the above code is converted to the following:

 <xsd:complexType name="Element-A> <xsd:sequence> <xsd:element name="element1" type="f1:elementDefinition" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="attribute1" type="xsd:string" use="required"/> <xsd:attribute name="attribute2" type="xsd:int" use="required"/> </xsd:complexType> <xsd:complexType name="elementDefinition"> <xsd:attribute name="id" type="xsd:string" /> </xsd:complexType> 

The above code ensures that you have a list in "Element-A" of type "elementDefinition" referenced by element1 in xsd.

0
source

Source: https://habr.com/ru/post/1445362/


All Articles