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.

Les éléments suivants peuvent vous aider: blog.bdoughan.com/2010/08/jaxb-namespaces.html et blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html
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