J'essaye de démarsaler un XML.
Voici à quoi ressemble mon XML
<DeviceInventory2Response xmlns="http://tempuri.org/">
<DeviceInventory2Result xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Obj123 xmlns="">
<Id>1</Id>
<Name>abc</Name>
</Obj123>
<Obj456 xmlns="">
.
.
.
J'essaye d'obtenir l'identifiant et le nom sous Obj123. Cependant, lorsque j'exécute ma commande unmarshal, j'obtiens l'erreur suivante.
An Error: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://tempuri.org/", local:"DeviceInventory2Response"). Expected elements are (none)
Mon code ressemble à ceci dans la classe principale:
Obj123 myObj123 = (Obj123) unmarshaller.unmarshal(inputSource);
Et ma classe pour Obj123 ressemble à ceci:
package com.myProj.pkg;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement(name="Obj123")
public class Obj123 {
private String Id;
private String Name;
public String getId() {
return Id;
}
public String getName() {
return Name;
}
}
J'ai pensé en définissant mon XMLRootElement que je devrais être capable de sauter les 2 premières lignes de mon XML, mais cela ne semble pas se produire. Des idées?
Éditer:
Voici comment mon contexte JAXB est créé:
JAXBContext jaxbContext = JAXBContext.newInstance();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Obj123 obj123 = (Obj123) unmarshaller.unmarshal(xmlStreamReader);
Les implémentations JAXB essaieront de correspondre sur l'élément racine du document (pas sur un élément enfant). Si vous souhaitez démarsaler au milieu d'un document XML, vous pouvez analyser le document avec StAX avancer le XMLStreamReader
à l'élément souhaité, puis démarsaler cela.
Pour plus d'informations
maintenant j'obtiens l'erreur suivante. Une erreur: javax.xml.bind.UnmarshalException - avec exception liée: [javax.xml.bind.UnmarshalException: élément inattendu (uri: "", local: "Obj123"). Les éléments attendus sont (aucun)].
Un JAXBContext
ne connaît que les classes dont vous lui parlez. Au lieu de:
JAXBContext jaxbContext = JAXBContext.newInstance();
Tu as besoin de faire:
JAXBContext jaxbContext = JAXBContext.newInstance(Obj123.class);
J'ai résolu le problème en ajoutant
@XmlRootElement(name="abc_xxx")
à la classe Root.
(où abc_XXX est la balise racine de votre XML)
Les classes JAXB générées par Eclipse n'ont pas ajouté cette annotation à ma classe racine.
Utilisez plutôt la classe ObjectFactory comme
JAXBContext jaxbContext = null;
try {
jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
} catch (JAXBException e) {
e.printStackTrace();
}
JAXBElement<ObjectFactory> applicationElement = null;
try {
applicationElement = (JAXBElement<ObjectFactory>)
unmarshaller.unmarshal(Thread.currentThread().getClass()
.getResourceAsStream(fileName));
} catch (JAXBException e) {
e.printStackTrace();
}
Essayez ceci et cela résoudra le problème ci-dessus. Mon problème a été résolu.