Jest sprzedawca dostarczone XML tak:JAXB i mniej przestrzeni nazw XML
<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Bar>...</Bar>
<Bar>...</Bar>
</Foo>
Uwaga nie ma deklaracji xmlns="..."
, ani sprzedawca dostarczy schematu. Nie można tego zmienić, a dostawca będzie nadal wysyłał XML w ten sposób w przyszłości.
Aby wygenerować powiązania JAXB, I utworzeniu schematu tak:
<?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>
Zauważ, że mam deklarowaną mniej lub bardziej sensowne nazw („http://acme.com/schema”), tak, że może on być stosowany do elementu referencje, itp XJC generuje następujące package-info.java
:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://acme.com/schema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.acme.schema;
Wtedy staram się unmarshal dokumentu XML:
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);
Oto wyjątek uzyskać:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Foo"). Expected elements are <{http://acme.com/schema}Foo>,...>
Oczywiście dzieje się tak dlatego, że elementy XML należą do pustej przestrzeni nazw, podczas gdy klasy JAXB ma niepusty jeden.
Czy istnieje sposób na sfałszowanie przestrzeni nazw XML (prawdopodobnie podczas analizy XML), aby JAXB rozpoznał elementy i skutecznie je powiązał? Rozwiązania SAX/StAX byłyby lepsze od DOM, ponieważ dokumenty XML mogłyby być raczej ogromne.
czy mogłabyś umieścić klas generowanych przez XJC na? –