XSD Problem mit enumeration

MySelV

Grünschnabel
Heyho,

ich hab folgende XSD

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://xml.netbeans.org/schema/BookSchema"
            xmlns:tns="http://xml.netbeans.org/schema/BookSchema"
            elementFormDefault="qualified">
    <xsd:element name="BookStore">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Book" minOccurs="1" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="Book">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string"/>
            <xsd:element name="title" type="xsd:string"/>
            <xsd:element name="author" type="xsd:string"/>
            <xsd:element name="year" type="xsd:string"/>
            <xsd:element name="genre" type="tns:Genre" form="qualified"/>
            <xsd:element name="usage" type="xsd:int"/>
        </xsd:sequence>
    </xsd:complexType>
    <!-- Define Genre -->
    <xsd:simpleType name="Genre">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="crime"/>
            <xsd:enumeration value="novelle"/>
            <xsd:length value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

Jetz hab ich bei einer Test-XML bei Genre mal "Test" eingetragen und er meckert nicht :( Sollte er aber! Was hab ich falsch gemacht?

Gruß Erik
 
Hi.

Das Problem ist, das das Book Element überhaupt keinen Bezug zum Typ Book hat. Du mußt den Typ noch spezifizieren.

Gruß
 
Danke, hatte es heute früh selbst gesehen. Schusselfehler. Hab die XSD jetz eh nochmal umgeschrieben. War mir etwas unübersichtlich - nun gehts:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://xml.netbeans.org/schema/BookSchema"
            xmlns:tns="http://xml.netbeans.org/schema/BookSchema"
            elementFormDefault="qualified">
    <xsd:element name="book-store" type="tns:type-book-store"/>
    
    <xsd:complexType name="type-book-store">
        <xsd:sequence>
            <xsd:element name="book" type="tns:type-book" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    
    <xsd:complexType name="type-book">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string"/>
            <xsd:element name="title" type="xsd:string"/>
            <xsd:element name="author" type="xsd:string"/>
            <xsd:element name="year" type="xsd:string"/>
            <xsd:element name="genre" type="tns:type-genre"/>
            <xsd:element name="boost" type="xsd:int"/>
        </xsd:sequence>
    </xsd:complexType>
    
    <xsd:simpleType name="type-genre">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="crime"/>
            <xsd:enumeration value="novelle"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
 
Auch wenn das Problem mit enum gelöst ist, habe ich nun ein Weiteres. Die XSD steht oben. Dazu will ich jetzt eine XML über JAXB generieren und auch wieder einlesen. Soweit ich weiß ist das Problem irgendwo beim namespace, wenn ich das im Internet richtig verstanden hab. Aber hier erstmal die Klasse:

Code:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "type-book-store", propOrder = {
    "book"
})
@XmlRootElement(name = "book-store", namespace ="http://xml.netbeans.org/schema/BookSchema")
public class TypeBookStore {
   ...
}

Dazu gibt er mir beim marshal folgendes:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:book-store xmlns:ns2="http://xml.netbeans.org/schema/BookSchema">
    <book>
     ...
    </book>
</ns2:book-store>

Da passt der namespace ja immernoch nicht so richtig. Sagt er auch, wenn ich die XML jetzt gegenüber der XSD validiere "could not fnd declaration of element ns2:book-store".

Wie muss ich den namespace bei @XmlRootElement definieren damit das klappt?

Danke für eure Hilfe ;)

Edit: Hier mal ein Stück wie es aussehen muss, allerdings frage ich mich wie ich das über die Annotations hinbekomme:
Code:
<ns0:book-store  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:ns0='http://xml.netbeans.org/schema/BookSchema'
   xsi:schemaLocation='http://xml.netbeans.org/schema/BookSchema BookSchema.xsd'>
        <ns0:book>
             ...
        </ns0:book>
   </ns0:book-store>

Las eben, dass wenn man es mit netbeans erzeugt eine package-info mit angelegt wird. Die sieht so aus:

Code:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://xml.netbeans.org/schema/BookSchema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package generated;
 
Zuletzt bearbeitet:
Sorry für den Doppelpost, aber ich will die Lösung mal trotzdem posten:

package-info ist für die Validation des Root-Elements (zu dem gibts ja meist kein Schema, weil es das erste Element ist => also Eigenverweis)
Code:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.w3.org/2001/XMLSchema-instance", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package generated;

TypeBookStore wird definiert durchs Schema:
Code:
@XmlRootElement(name = "book-store", namespace = "http://xml.netbeans.org/schema/BookSchema")
public class TypeBookStore {
    ...
}

In der aufrufenden Java Class fehlte dem Marshaller ein Property:
Code:
...
m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://xml.netbeans.org/schema/BookSchema BookSchema.xsd");
...

So nächstes Problem (XML ist korrekt und valid!) :
Beim Unmarshall bekomm ich die Fehlermeldung, dass das erwartete Element (none) sein sollte und nicht book-store.

Der Marshaller sieht so aus:
Code:
TypeBookStore store = (TypeBookStore) unmarshaller.unmarshal(new FileInputStream(Constants.XMLPATH));

Die @XmlRootElement steht oben an der Klasse. Wo liegt der Fehler? (Schema immernoch wie oben)

Gruß Erik
 

Neue Beiträge

Zurück