2010-08-31 6 views
1

J'ai un fichier xsd d'une tierce partie qui était avec "include" et non "import". J'utilise ce fichier xsd pour générer des fichiers java, en utilisant jaxb. La structure xsd initiale a donné une sortie dans laquelle la même classe était incluse dans différents paquets. par exemple, si deux paquets ont été générés, "aa" et "bb", tous deux inclus le même fichier commun:Génération de classes java à partir de fichiers xsd

aa/commonElement.java
aa/a.java

bb/commonElement.java
bb/b.java

C'était quelque chose que je voulais éviter, je voulais commonElement.java à créer une fois dans seul paquet et que importé le reste, donc j'ai commencé à utiliser l'importation à la place.

<xs:schema xmlns="http://www.ns.com/aa" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:DD="http://www.ns.com/common" targetNamespace="http://www.ns.com/aa" elementFormDefault="qualified" jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"> 

<xs:import namespace="http://www.ns.com/common" schemaLocation="common.xsd"/> 
    <xs:element name="Response"> 
       <xs:complexType> 
         <xs:sequence> 
            <xs:element name="element" type="DD:commonElement" ../> 

Les classes Java ont été créées et compilées et comme prévu.

commune/commonElement.java
aa/aa.java

Le problème est quand je reçois un résultat d'aa, d'un appel api et unmarshal les résultats, je reçois aa classe avec commonElement créé correctement, mais avec des champs vides. Je suppose que les champs sont vides parce que le unmarshler ne comprend pas qu'il a besoin de chercher la définition dans l'espace de noms "commun" et les cherche plutôt dans le namespace "aa" mais comment le faire fonctionner correctement?

Merci pour l'aide

+0

Avez-vous un exemple XSD et mis à l'échelle vers le bas XML que vous pouvez poster qui montre votre problème? –

Répondre

0

Je n'ai pas assez d'informations pour diagnostiquer pourquoi votre unmarshal ne se passe pas correctement. Ce qui suit fonctionnera, vous pourriez être en mesure de le comparer à ce que vous faites pour trouver l'erreur.

Les candidats les plus probables sont les suivantes:

  • Vous ne disent pas JAXB sur les classes assez lorsque vous créez le JAXBContext.
  • Votre document XML n'est pas correctement qualifié pour l'espace de nom.

Utilisation des schémas suivants:

Common.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.ns.com/common" 
    xmlns="http://www.ns.com/common" 
    elementFormDefault="qualified"> 

    <xs:complexType name="commonElement"> 
     <xs:sequence> 
      <xs:element name="commonChild" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

aa.xsd

<xs:schema xmlns="http://www.ns.com/aa" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:DD="http://www.ns.com/common" targetNamespace="http://www.ns.com/aa" 
    elementFormDefault="qualified"> 

    <xs:import namespace="http://www.ns.com/common" 
     schemaLocation="common.xsd" /> 

    <xs:element name="Response"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="element" type="DD:commonElement" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Les classes suivantes ont été produites:

com.ns.aa.package-info

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ns.com/aa", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.ns.aa; 

com.ns.aa.Réponse

package com.ns.aa; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 
import com.ns.common.CommonElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "element" 
}) 
@XmlRootElement(name = "Response") 
public class Response { 

    @XmlElement(required = true) 
    protected CommonElement element; 

    public CommonElement getElement() { 
     return element; 
    } 

    public void setElement(CommonElement value) { 
     this.element = value; 
    } 

} 

com.ns.common.package-info

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ns.com/common", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.ns.common; 

com.ns.common.CommonElement

package com.ns.common; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "commonElement", propOrder = { 
    "commonChild" 
}) 
public class CommonElement { 

    @XmlElement(required = true) 
    protected String commonChild; 

    public String getCommonChild() { 
     return commonChild; 
    } 

    public void setCommonChild(String value) { 
     this.commonChild = value; 
    } 

} 

Avec ces classes, je peux désorganiser la document XML suivant:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:Response xmlns="http://www.ns.com/common" xmlns:ns2="http://www.ns.com/aa"> 
    <ns2:element> 
     <commonChild>FOO</commonChild> 
    </ns2:element> 
</ns2:Response> 

En utilisant le code suivant:

Démo

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

import com.ns.aa.Response; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Response.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("input.xml"); 
     Response response = (Response) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(response, System.out); 
    } 
} 
+0

Vous avez raison. Le problème est que je ne reçois pas le xml avec les attributs corrects, comme dans votre exemple , pour refléter le changement de schéma que j'ai fait. Et quand j'ai édité manuellement le xml, l'objet a été correctement agrandi. La chose est que si je ne peux pas contrôler la structure xml, puisque je le reçois d'une autre partie. Donc la question est la suivante: Puis-je faire un changement de mon côté afin que le démasquage réussisse à trouver les éléments de toute façon? Merci – anyab

+0

Pouvez-vous fournir un exemple de document? La réponse dépend si "element" est dans l'espace de nom par défaut ou pas d'espace de noms. –

Questions connexes