Es gibt eine vom Hersteller bereitgestellte XML wie folgt aus:JAXB und Namespace-less XML
<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Bar>...</Bar>
<Bar>...</Bar>
</Foo>
Hinweis gibt es keine xmlns="..."
Erklärung, noch der Verkäufer ein Schema liefern. Dies kann nicht geändert werden, und der Anbieter wird XML in Zukunft weiterhin so versenden.
JAXB Bindungen zu erzeugen, habe ich ein Schema wie folgt erstellt:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://acme.com/schema"
xmlns:tns="http://acme.com/schema"
elementFormDefault="qualified">
<xsd:element name="Foo">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="tns:Bar" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Bar">
...
</xsd:element>
</xsd:schema>
Bitte beachte, dass ich einen mehr oder weniger sinnvollen Namensraum deklariert haben („http://acme.com/schema“), so dass es für das Element verwendet werden könnte, Referenzen usw. XJC erzeugt die folgende package-info.java
:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://acme.com/schema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.acme.schema;
Dann versuche ich zu Abstellungs XML-Dokument:
JAXBContext jaxb = JAXBContext.newInstance("com.acme.schema");
Unmarshaller unmarshaller = jaxb.createUnmarshaller();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.xml");
InputSource source = new InputSource(is);
Foo foo = (Foo) unmarshaller.unmarshal(source);
Hier ist die Ausnahme, die ich erhalten:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Foo"). Expected elements are <{http://acme.com/schema}Foo>,...>
Offensichtlich ist dies geschieht, weil XML-Elemente in einen leeren Namensraum gehören, während JAXB-Klassen eine nicht-leere haben.
Gibt es eine Möglichkeit, einen XML-Namespace zu fälschen (wahrscheinlich während des XML-Parsens), damit JAXB die Elemente erkennt und erfolgreich bindet? SAX/StAX-Lösungen würden gegenüber DOM bevorzugt, da XML-Dokumente ziemlich umfangreich sein könnten.
würde es Ihnen etwas ausmachen Klassen von XJC auf erzeugt setzen? –