2017-05-11 1 views
2

J'essaye de générer des POJO via le plugin maven JAXB pour analyser le XML que j'ai. J'ai un élément de niveau racine dans mon XML qui a un espace de noms qui est différent des autres éléments à l'intérieur. Voici le XML:XSD: Les éléments importés d'un espace de noms différent occupent l'espace de noms cible du parent lors de la génération de POJOs via le plugin Jaxb

 <?xml version="1.0" encoding="UTF-8"?> 
<skuFlatFileType xmlns="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd" xmlns:ns0="http://www.xyz/schemas/dbm/product/V1"> 
     <FlattenedSKU> 
      <ns0:SKU></ns0:SKU> 
</FlattenedSKU> 
</skuFlatFileType> 

Depuis FlattenedSKU et SKU sont dans les différents espaces de noms. J'ai donc déclaré un XSD séparé pour tous les éléments sous FlattenedSKU, puis je l'ai importé dans le fichier parent. Le regard XSD comme ceci:

sku_wrapper.xsd

<xs:schema 
    xmlns="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd" 
    targetNamespace="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:ns0="http://www.xyz/schemas/dbm/product/V1"> 
    <xs:import namespace="http://www.xyz/schemas/dbm/product/V1" 
     schemaLocation="sku.xsd" /> 
    <xs:element name="FlattenedSKU"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="SKU" type="ns0:SKU"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     </xs:schema> 

Le xsd enfant est comme suit:

sku.xsd

<xs:schema attributeFormDefault="qualified" 
    elementFormDefault="qualified" 
    xmlns="http://www.xyz/schemas/dbm/product/V1" 
    targetNamespace="http://www.xyz/schemas/dbm/product/V1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="SKU"> 
     <xs:sequence> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Maintenant, la classe java généré ressemble à ceci:

@XmlRootElement(name = "FlattenedSKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd") 
public class FlattenedSKU { 

@XmlElement(name = "SKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd", required = true) 
protected SKU sku; 

Mais ce que je dois est la suivante:

@XmlRootElement(name = "FlattenedSKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd") 
public class FlattenedSKU { 

@XmlElement(name = "SKU", namespace = "http://www.xyz/schemas/dbm/product/V1", required = true) 
protected SKU sku; 

quelqu'un peut me dire ce que je fais mal?

+0

est-ce pas la génération correcte de JAXB? Votre élément SKU est défini dans l'espace de noms '' http: // www.abc/schemas/xyz/sdf/Schemas/Schema.xsd' '' Seul son TYPE est défini dans un espace de noms différent selon votre schéma – Optional

+0

Je ne suis pas J'ai suivi cette réponse: http://stackoverflow.com/questions/6413145/xsd-with-elements-from-other-namespace mais cela n'a pas fonctionné Avez-vous une idée de comment réaliser ce que je suis? –

+0

Vous venez de poster ma réponse, veuillez comprendre la différence entre "créer" un élément de type et y faire référence Quand vous créez un élément d'un type défini dans un autre schéma, cet élément nouvellement créé appartient à l'espace de nom de schéma que vous ajoutez – Optional

Répondre

1

En plus à mon commentaire ce que vous ferez est « ref » à un élément sku.xsd et ne pas créer un élément dans sku_wrapper.xsd

Ainsi suivant est travailler pour vous:

sku.xsd

<xs:schema attributeFormDefault="qualified" 
    elementFormDefault="qualified" 
    xmlns="http://www.xyz/schemas/dbm/product/V1" 
    targetNamespace="http://www.xyz/schemas/dbm/product/V1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="SKU"> 
     <xs:sequence> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="SKU" type="SKU"/> 
</xs:schema> 

Notez que change est déclaration d'élément ici.

sku_wrapper.xsd

<xs:schema 
    xmlns="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd" 
    targetNamespace="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:ns0="http://www.xyz/schemas/dbm/product/V1"> 
    <xs:import namespace="http://ww 

w.xyz/schemas/dbm/product/V1" 
     schemaLocation="sku.xsd" /> 
    <xs:element name="FlattenedSKU"> 
     <xs:complexType> 
      <xs:sequence> 
        <xs:element ref="ns0:SKU"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:schema> 

Notez la référence de l'élément ici

+0

Oui, l'attribut ref fait le travail, mais maintenant l'espace de nom n'apparaît pas dans les éléments enfants du POJO généré @XmlRootElement (name = "FlattenedSKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd ") public class FlattenedSKU { @XmlElement (name = "SKU", nécessaire = true) protégé SKU sku; –

+0

@AryanSingh Avez-vous passé ce – Optional

+0

Yup a passé la question Comme mentionné ci-dessus au commentaire couldn?. –