# XmlRootElement und JAXB



## MySelV (7. Mrz 2009)

Heyho,

kämpfe grade mit einer Validation einer XML gegenüber einer XSD und es liegt wohl am namespace. Es finden sich einige Dinge im Internet, allerdings half bisher keins so recht.
Ich bekomm beim marshal die beliebte "could not find declaration of element [mein-root-element]" Exception.

Hier meine XSD:
[HIGHLIGHT="xml"]<?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>
    ...
   <!-- Define "Book" -->
    ...
</xsd:schema>[/HIGHLIGHT]

Dazu die JAVA-Klasse, mit dem XmlRootElement:

[HIGHLIGHT="Java"]@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "type-book-store", propOrder = {
    "book"
})
@XmlRootElement(name = "book-store", namespace = "http://www.w3.org/2001/XMLSchema-instance")
public class TypeBookStore {
   ...
}[/HIGHLIGHT]

Daraus bekomme ich beim Generieren folgende XML:
[HIGHLIGHT="xml"]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsi:book-store xmlns="http://xml.netbeans.org/schema/BookSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsi:book>
       ...
    </xsi:book>
</xsi:book-store>[/HIGHLIGHT]

Das passt vom namespace her noch nicht. Korrekt müsste es so aussehen:
[HIGHLIGHT="xml"]<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>[/HIGHLIGHT]

Die Frage ist nun, wie bekomm ich die namespaces alle dahin? Nur über @XmlRootElement(namespace = "[Hier brauch ich den Namespace]") gehts nicht.

Danke fürs Lesen


----------



## gex (8. Mrz 2009)

Heyho,

müsste

```
@XmlRootElement(name = "book-store", namespace = "http://www.w3.org/2001/XMLSchema-instance")
```

nicht eher so aussehen?

```
@XmlRootElement(name = "book-store", namespace = "http://xml.netbeans.org/schema/BookSchema")
```

Gruss


----------



## MySelV (8. Mrz 2009)

Japp das auch  . Hab die Lösung nun. Allerdings auch gleich ein neues Problem 

Lösung zum alten Problem:

=== package-info ===
[HIGHLIGHT="Java"]@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.w3.org/2001/XMLSchema-instance", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package generated;[/HIGHLIGHT]

=== Type-Klasse (TypeBookStore) ===
[HIGHLIGHT="Java"]@XmlRootElement(name = "book-store", namespace = "http://xml.netbeans.org/schema/BookSchema")
public class TypeBookStore {
   ...
}[/HIGHLIGHT]

=== Marshaller in der aufrufenden Klasse ===
[HIGHLIGHT="Java"]
...
 Marshaller m = context.createMarshaller();
...
m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://xml.netbeans.org/schema/BookSchema BookSchema.xsd");[/HIGHLIGHT]
Ihm fehlte quasi noch als Property der Verweis zum Schema. Wer eine genauere Erklärung hat, soll sie mir mal sagen - ich versteh die Logik noch nicht 100%ig.
=> XML ist korrekt und valid!

So nun zum neuen Problem:
Beim unmarshal bekomm ich eine Exception, weil das erwartete Element "none" ist, aber da "book-store" steht. Liegt das jetzt wieder am Namespace?

Mein Unmarshalling bisher:
[HIGHLIGHT="Java"]JAXBContext context = JAXBContext.newInstance();
            Unmarshaller unmarshaller = context.createUnmarshaller();
            unmarshaller.setSchema(schema);

            TypeBookStore store = (TypeBookStore) unmarshaller.unmarshal(new FileInputStream(Constants.XMLPATH));[/HIGHLIGHT]

Schema und alles Andere ist immernoch wie oben.


----------



## gex (8. Mrz 2009)

Du könntest dir mal initial deine JAXB Klassen mit XJC generieren lassen:

Siehe:
JAXB RI 1.0.5 -- Binding Compiler (xjc)

Dann könntest du davon aussgehen, dass sicher das JAXB Mapping stimmt.


----------



## Wildcard (9. Mrz 2009)

Wenn du genug von JAXB hast, steig auf EMF um. Ein wesentlich mächtigeres Binding Framework.


----------

