XML unmarshalling à l'aide de Jaxb avec des espaces de noms et de schéma
J'ai un document XML qui ressemble à ceci:
<?xml version="1.0" encoding="UTF-8"?>
<xs:msgdata xmlns:xs="http://www.myCompany.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.myCompany.com msgdata.xsd">
<xs:msgid>MsgID001</xs:msgid>
<xs:msgHash>hlkJKLHljkhkjlHKJLHkjl6y987HJKH</xs:msgHash>
</xs:msgdata>
Un document de schéma (appelé msgdata.xsd) a également été envoyé à moi. Je suis à l'aide de JAXB pour unmarshall ci-dessus document xml dans un objet Java.
Le unmarshalling code est indiqué ci-dessous:
final JAXBContext context = JAXBContext.newInstance(clazz);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("C:\\temp\\msgdata.xsd"));
final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
return (T) unmarshaller.unmarshal(new StringReader(xml));
L'objet cible pour le XML est présenté ci-dessous (L'objet est ensuite converti en hibernation entité.
@XmlRootElement(name = "msgdata")
public class Message {
private String msgid;
private String msgHash;
@XmlElement(name = "msgid")
public String getMsgid() {
return msgid;
}
public void setMsgid(String msgid) {
this.msgid = msgid;
}
@XmlElement(name = "msgHash")
public String getMsgHash() {
return msgHash;
}
public void setMsgHash(String msgHash) {
this.msgHash = msgHash;
}
Un couple de questions:
- J'ai un service de repos où je vais recevoir un document XML dans le format indiqué ci-dessus. Quelle est la référence du document de schéma. Je sais que le document de schéma est utilisé pour la validation du document XML. Je pense que la façon dont cela fonctionne est que j'utilise ce schéma pour valider les documents XML que je reçois par le RESTE du service. Maintenant, le problème est de savoir comment puis-je accéder au schéma? Dois-je viens de le stocker quelque part sur mon système de fichiers et d'y accéder comme indiqué ci-dessus?
Le document XML a une référence au schéma (Voir la schemaLocation entrée). Comment trouver le schéma du document sur mon système de fichier? Est que le schéma de référence requis dans le document XML?
-
Le document XML comme il est maintenant impossible de unmarshalled. Lorsque j'essaie de unmarshal, je reçois le message d'erreur suivant:
Causés par: javax.xml.bind.UnmarshalException: élément inattendu
(uri:"http://www.myCompany.com", locale:"msgdata"). Éléments attendus
sont <{}msgdata>
au com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:662)
[jaxb-impl-2.2.4.jar:]
au com.soleil.xml.bind.v2.moment de l'exécution.unmarshaller.Loader.reportError(Loader.java:258)
[jaxb-impl-2.2.4.jar:]
au com.soleil.xml.bind.v2.moment de l'exécution.unmarshaller.Loader.reportError(Loader.java:253)
[jaxb-impl-2.2.4.jar:]
au com.soleil.xml.bind.v2.moment de l'exécution.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:120)
[jaxb-impl-2.2.4.jar:]
au com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1063)
[jaxb-impl-2.2.4.jar:]
au com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:498)
[jaxb-impl-2.2.4.jar:]
au com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:480)
[jaxb-impl-2.2.4.jar:]
au com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:102)
[jaxb-impl-2.2.4.jar:]
au com.soleil.xml.bind.v2.moment de l'exécution.unmarshaller.SAXConnector.startElement(SAXConnector.java:150)
[jaxb-impl-2.2.4.jar:]
au org.apache.xerces.les parseurs.AbstractSAXParser.startElement(Inconnu
Source) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Inconnu
Source) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Inconnu
Source) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Inconnu
Source) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Inconnu
Source) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.les parseurs.XML11Configuration.parse(Source Inconnue) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.les parseurs.XML11Configuration.parse(Source Inconnue) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.les parseurs.XMLParser.parse(Source Inconnue) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.les parseurs.AbstractSAXParser.parse(Source Inconnue) [xercesImpl-2.9.1.jar:]
au org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Inconnu
Source) [xercesImpl-2.9.1.jar:]
au com.soleil.xml.bind.v2.moment de l'exécution.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:217)
[jaxb-impl-2.2.4.jar:]
au com.soleil.xml.bind.v2.moment de l'exécution.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189)
[jaxb-impl-2.2.4.jar:]
au javax.xml.bind.les aides.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:136)
[jboss-jaxb-api_2.2_spec-1.0.3.Final.jar:1.0.3.Final]
au javax.xml.bind.les aides.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:193)
[jboss-jaxb-api_2.2_spec-1.0.3.Final.jar:1.0.3.Final]
... 31 plus
J'ai pensé l'espace de noms est défini dans le document xml. Je suis pas en utilisant correctement le schéma ou l'espace de noms définition n'est pas correcte. Ce que je fais mal?
Grâce.
Le schéma de mettre les éléments dans les espaces de noms que vous êtes enceinte? Post le schéma si vous voulez ;]
Je suis à l'aide de JAXB pour unmarshall le xml, c'est à dire convertir à partir de XML dans un objet java, pas l'inverse. Merci
OriginalL'auteur ziggy | 2012-02-15
Vous devez vous connecter pour publier un commentaire.
En général, pour savoir comment accéder aux fichiers XSD (ou autres) dans votre application web Java (puisque vous avez mentionné REPOS), vous pourriez commencer ici. Ne jamais compter sur les chemins absolus, pour le déploiement, ainsi que des raisons de sécurité.
Xsi emplacement du schéma attributs sont seulement indicatives; elles ne sont pas nécessaires. Même si la présentation de ces n'avez pas à être considéré. Pour un serveur de l'application côté, je n'aurais jamais les utiliser de toute façon; on doit s'appuyer sur des ressources incorporées, ou de l'utilisation d'un catalogue comme concept à une confiance/emplacement sécurisé.
Le fait qu'il n'est pas unmarshal, est clair dans le message d'erreur: il s'attend à un pas d'espace de noms de l'élément <{}msgdata> plutôt que <{http://www.myCompany.com}msgdata>.
Vous avez besoin de modifier le XML ou ammend votre classe afin d'inclure des choses comme @XmlElement(name="...", namespace="http://www.myCompany.com")
Je dirais qu'au vu de schéma XML et sont corrects, vos annotations ne sont pas synchronisés.
Oui, veuillez utiliser @ XmlElement ou @ XmlRootElement avec le nom et l'espace de noms: (name="...", namespace="myCompany.com")
J'ai essayé et il semble que j'ai besoin de spécifier l'espace de noms sur chaque champ. Est il possible que je peux spécifier l'espace de noms à l'échelle mondiale?
Je voudrais utiliser le @XmlSchema annotation au niveau du package. Il devrait ressembler à ceci: @javax.xml.bind.annotation.XmlSchema(namespace="myCompany.com", elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIÉ) package com.mypackage;
OriginalL'auteur Petru Gardea