C'è un XML fornito dal produttore come questo:JAXB e XML namespace-meno
<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Bar>...</Bar>
<Bar>...</Bar>
</Foo>
Nota non v'è alcuna dichiarazione xmlns="..."
, né il venditore fornisce uno schema. Questo non può essere modificato e il fornitore continuerà a spedire XML come questo in futuro.
Per generare attacchi JAXB, ho creato uno schema come questo:
<?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>
Nota che ho dichiarato uno spazio dei nomi più o meno significativo ("http://acme.com/schema") in modo che potrebbe essere utilizzato per l'elemento riferimenti, ecc XJC genera il seguente package-info.java
:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://acme.com/schema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.acme.schema;
poi cerco di unmarshal documento 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);
.210
Ecco l'eccezione ottengo:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Foo"). Expected elements are <{http://acme.com/schema}Foo>,...>
Ovviamente, questo accade perché gli elementi XML appartengono a uno spazio dei nomi vuoto, mentre le classi JAXB hanno una non-vuoto.
C'è un modo per simulare uno spazio dei nomi XML (probabilmente durante l'analisi XML), in modo che JAXB possa riconoscere gli elementi e vincolarli correttamente? Le soluzioni SAX/StAX sarebbero preferite rispetto al DOM, perché i documenti XML potrebbero essere piuttosto grandi.
ti dispiacerebbe mettere classi generate da XJC su? –