unexpected element (uri:"", local:"Group"). Expected elements are <{}group>
Rencontrer une exception lors de la décompression de XML
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));
La classe de groupe n'a aucune annotation et group.xml ne contient que des données.
Quelque chose peut être la cause?
Il semble que votre document XML comporte l'élément racine "Groupe" au lieu de "groupe". Vous pouvez:
Vous devez mettre package-info.Java dans votre package jaxb généré. Son contenu devrait être quelque chose comme ça
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;
Heureusement, la classe package-info n'est pas requise. J'ai pu résoudre le problème des mines avec la solution iowatiger08.
Voici mon correctif montrant le message d'erreur pour aider à joindre les points pour certains.
Message d'erreur
javax.xml.bind.UnmarshalException: élément inattendu (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", local: "errorresource"). Les éléments attendus sont <{} errorresource>
Code avant correction
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource")
public class Errorresource
Code après correction
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0")
public class Errorresource
Vous pouvez voir l'espace de noms ajouté à @XmlRootElement, comme indiqué dans le message d'erreur.
Après avoir cherché plus, l'élément racine doit être associé à un espace de noms de schéma comme Blaise le note. Pourtant, je n'ai pas eu un paquet-information Java. Donc, sans utiliser l'annotation @XMLSchema, j'ai pu corriger ce problème en utilisant
@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}
J'espère que cela t'aides!
C'est un correctif pour un cas d'utilisation assez intéressant, mais cela me convient à chaque fois. Si vous utilisez le générateur Eclipse Jaxb, il crée un fichier appelé package-info.
@javax.xml.bind.annotation.XmlSchema(namespace = "blah.xxx.com/em/feed/v2/CommonFeed")
package xxx.blah.mh.domain.pl3xx.startstop;
Si vous supprimez ce fichier, un xml plus générique sera analysé. Essaie!
J'ai eu le même problème .. Cela m'a aidé, je spécifie les mêmes noms de champs de mes classes que les noms de balises dans le fichier XML (le fichier provient d'un système externe).
Par exemple:
Mon fichier XML:
<Response>
<ESList>
<Item>
<ID>1</ID>
<Name>Some name 1</Name>
<Code>Some code</Code>
<Url>Some Url</Url>
<RegionList>
<Item>
<ID>2</ID>
<Name>Some name 2</Name>
</Item>
</RegionList>
</Item>
</ESList>
</Response>
Ma classe de réponse:
@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
@XmlElement
private ESList[] ESList = new ESList[1]; // as the tag name in the xml file..
// getter and setter here
}
Ma classe ESList:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ESList")
public class ESList {
@XmlElement
private Item[] Item = new Item[1]; // as the tag name in the xml file..
// getters and setters here
}
Ma classe d'objets:
@XmlRootElement(name="Item")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlElement
private String ID; // as the tag name in the xml file..
@XmlElement
private String Name; // and so on...
@XmlElement
private String Code;
@XmlElement
private String Url;
@XmlElement
private RegionList[] RegionList = new RegionList[1];
// getters and setters here
}
Ma classe RegionList:
@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
Item[] Item = new Item[1];
// getters and setters here
}
Mon cours DemoUnmarshalling:
public class DemoUnmarshalling {
public static void main(String[] args) {
try {
File file = new File("...");
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.setEventHandler(
new ValidationEventHandler() {
public boolean handleEvent(ValidationEvent event ) {
throw new RuntimeException(event.getMessage(),
event.getLinkedException());
}
}
);
Response response = (Response) jaxbUnmarshaller.unmarshal(file);
ESList[] esList = response.getESList();
Item[] item = esList[0].getItem();
RegionList[] regionLists = item[0].getRegionList();
Item[] regionListItem = regionLists[0].getItem();
System.out.println(item[0].getID());
System.out.println(item[0].getName());
System.out.println(item[0].getCode());
System.out.println(item[0].getUrl());
System.out.println(regionListItem[0].getID());
System.out.println(regionListItem[0].getName());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
Il donne:
1
Some name 1
Some code
Some Url
2
Some name 2
J'ai eu le même problème. J'ai ajouté les attributs suivants à <xs:schema..>
elementFormDefault = "qualifié" attributeFormDefault = "non qualifié"
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.com/schemas/ArrayOfMarketWithStations"
targetNamespace="http://www.example.com/schemas/ArrayOfMarketWithStations"
elementFormDefault="qualified" attributeFormDefault="unqualified" >
et re-généré des classes Java en exécutant xjc, qui corrigeait package-info.Java.
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
Cela a résolu le problème pour moi.
Même chose pour moi. Le nom de la classe de mappage était Mbean
mais le nom racine de la balise était mbean
.
@XmlRootElement(name="mbean")
public class MBean { ... }
Vous devez mettre package-info.Java
class dans le package de contextPath et mettre le code ci-dessous dans la même classe:
@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.namespaceUrl.com/xml/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.valueobject;