# Fehler beim Erzeugen eines XML-Schema



## Andreas (19. Mrz 2012)

Hallo Zusammen

ich habe ein Problem mit der erzeugung eines XML-Schema per JAXB-Api.

Ich erzeuge z. B. folgendes Schema

[XML]<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="arzt">
    <xs:all>
      <xs:element minOccurs="0" name="id" type="xs:string"/>
      <xs:element minOccurs="0" name="version" type="xs:string"/>
      <xs:element minOccurs="0" name="created" type="xs:string"/>
      <xs:element minOccurs="0" name="lastchange" type="xs:string"/>
      <xs:element minOccurs="0" name="name" type="xs:string"/>
      <xs:element minOccurs="0" name="lanr" type="xs:string"/>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="arzt_praxis">
    <xs:all>
      <xs:element maxOccurs="1" minOccurs="0" name="arzt" type="arzt"/>
      <xs:element maxOccurs="1" minOccurs="0" name="praxis" type="praxis"/>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="praxis">
    <xs:all>
      <xs:element minOccurs="0" name="id" type="xs:string"/>
      <xs:element minOccurs="0" name="version" type="xs:string"/>
      <xs:element minOccurs="0" name="created" type="xs:string"/>
      <xs:element minOccurs="0" name="lastchange" type="xs:string"/>
      <xs:element minOccurs="0" name="adresse" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:schema>[/XML]

Vorgehalten wird das Ganze in einem 
	
	
	
	





```
org.w3c.dom.Document
```
. Wenn ich jetzt durch den Aufruf

```
schema = factory.newSchema(new DOMSource(doc, "mem:\\\\memory.schema"));
```
 ein Schemaobjekt erzeugen will, kriege ich folgende Fehlermeldung.

org.xml.sax.SAXParseException: s4s-elt-invalid-content.1: The content of 'arzt' is invalid.  Element 'xs:all' is invalid, misplaced, or occurs too often.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2541)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2528)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDAbstractTraverser.reportSchemaError(XSDAbstractTraverser.java:706)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.handleComplexTypeError(XSDComplexTypeTraverser.java:1119)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseComplexTypeDecl(XSDComplexTypeTraverser.java:285)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseGlobal(XSDComplexTypeTraverser.java:160)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseSchemas(XSDHandler.java:1255)
	at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:579)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519)
	at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485)
	at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:210)
	at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:594)
	at de.kvwl.rust.resourcetranformer.xml.XMLSchemaMetadataRenderer.createSchema(XMLSchemaMetadataRenderer.java:161)
	at de.kvwl.rust.resourcetranformer.xml.XMLSchemaMetadataRenderer.main(XMLSchemaMetadataRenderer.java:319)

Soweit alles noch nicht wild. Das Lustige ist jetzt aber noch, dass der Validator vom W3C mir bescheinigt, dass das Schema einwandfrei und ohne Fehler ist. Weis einer woran es noch liegen könnte???


----------



## nillehammer (19. Mrz 2012)

Wenn man der Erklärung von w3c-Schools zum xs:all glauben kann (XML Schema all Element), hast Du Widersprüche in Deinem Schema. Mit xs:all ohne Attribute sagst Du nämlich, dass alle Elemente genau einmal vorkommen müssen. Mit dem minOccurs=0 sagst Du bei den Elementen dann: "darf doch weggelassen werden". Vielleicht ist der w3c-Validator da etwas toleranter als der Xercses.

Im Prinzip müsstest Du das "minOccurs=0" in das xs:all reinschreiben und könntest es Dir bei den einzelnen xs:elements dan schenken.

P.S. das maxOccurs in den Elementen ist übrigens überflüssig. Das wird schon durch das xs:all ausgedrückt und kann dort auch nicht geändert werden.


----------



## nillehammer (19. Mrz 2012)

Hier nochmal der Auszug aus der Schemadatei für XML-Schemas:
[XML]
<xs:complexType name="all" mixed="false">
  <xs:annotation>
    <xs:documentation>Only elements allowed inside</xs:documentation> 
  </xs:annotation>
  <xs:complexContent>
    <xs:restriction base="xs:explicitGroup">
      <xs:group ref="xs:allModel" /> 
      <xs:attribute name="minOccurs" use="optional" default="1">
      <xs:simpleType>
        <xs:restriction base="xs:nonNegativeInteger">
          <xs:enumeration value="0" /> 
          <xs:enumeration value="1" /> 
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="maxOccurs" use="optional" default="1">
      <xs:simpleType>
        <xs:restriction base="xs:allNNI">
          <xs:enumeration value="1" /> 
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:anyAttribute namespace="##other" processContents="lax" /> 
  </xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name="all" id="all" type="xs:all">
  <xs:annotation>
    <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-all" /> 
  </xs:annotation>
</xs:element>
[/XML]
Laut dem stimmt die Beschreibung auf w3schools. Die Dokumentation auf w3.org ist da leider genau so wie deren Parser etwas schwammiger. Dumm, weil das ja eigentlich die Referenz sein sollte...


----------



## Andreas (20. Mrz 2012)

Hi

leider war es das nicht. Folgendes Schema (Ausschnitt) produziert den selben Fehler:

[XML]<?xml version="1.0" encoding="UTF-8" standalone="no"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="arzt">
    <xs:all minOccurs="0">
      <xs:element name="id" type="xs:string"/>
      <xs:element name="version" type="xs:string"/>
      <xs:element name="created" type="xs:string"/>
      <xs:element name="lastchange" type="xs:string"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="lanr" type="xs:string"/>
    </xs:all>
  </xs:complexType>[/XML]

Ich les aus der w3schools beschreibung aber auch nicht unbedingt raus, dass man bei den Elementen kein minOccurs angeben darf. Vor allem muss ich da später auch unterschiedliche Werte verwenden. Das ginge mit xs:all ja dann gar nicht.

Wenn ich sequence oder choice nehme habe ich übrigens auch den gleichen Fehler.


----------



## Andreas (20. Mrz 2012)

Habs rausbekommen.

man muss die elemente unter Angabe des Namespaces erzeugen z.B. 
	
	
	
	





```
doc.createElementNS(NS, "xs:complexType");
```

Das Schema-Element muss dann noch den Namespace bekommen sonst findet der die primitiven Datentypen nich:


```
final Element root = doc.createElementNS(NS, "xs:schema");
root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE + ":xs", XMLConstants.W3C_XML_SCHEMA_NS_URI);
```


----------

