Fehler beim Erzeugen eines XML-Schema

Andreas

Mitglied
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
Code:
org.w3c.dom.Document
. Wenn ich jetzt durch den Aufruf
Code:
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???
 
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.
 
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...
 
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.
 
Zuletzt bearbeitet:
Habs rausbekommen.

man muss die elemente unter Angabe des Namespaces erzeugen z.B.
Code:
doc.createElementNS(NS, "xs:complexType");

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

Java:
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);
 

Neue Themen


Zurück
Oben