2011-08-20 3 views
1

Nous travaillons avec Jaxb à unmarshall, un grand document profondément imbriqué. Xjc ne fonctionnerait pas avec le schéma, nous devons donc le faire à la main. Des suggestions pour tester des stratégies ici?Stratégie Jaxb pour tester les mappages de documents volumineux

Je pense que je voudrais écrire des tests de cartographie pour chaque classe imbriquée comme je vais, idéalement en utilisant de petits fragments XML plutôt que de nombreuses variantes de documents complets. Cependant, je ne vois pas comment le faire en raison de problèmes d'espace de noms. Ceci est un fragment que je voudrais valider:

<responsibleParty> 
    <gmd:individualName> 
     <gco:CharacterString>Someones name</gco:CharacterString> 
    </gmd:individualName> 
</responsibleParty> 

Je ne vois pas grand-chose à faire. Des suggestions de stratégies ici?

Merci!

+0

Yikes! Pourquoi xjc n'a-t-il pas travaillé sur le schéma? Un outil automatisé est certainement le meilleur choix ici! Il vaut mieux réparer le XSD que d'essayer d'écrire un cas de test pour couvrir toutes les conditions aux limites ... – maerics

+0

Le schéma est défini par d'autres groupes, donc je ne peux pas le réparer, mais je ne suis pas sûr qu'il soit cassé. J'ai travaillé sur les mappages de liaison pour que XJC puisse fonctionner. Cependant le code résultant ne compilera pas, le schéma utilise l'imbrication récursive, xjc ne peut pas sembler s'occuper de cela. J'ai rencontré ce problème [https://forums.oracle.com/forums/thread.jspa?messageID=9259888] Je n'ai pas encore essayé de le faire à la main pour voir s'il est possible de le traiter. – Nate

Répondre

1

Si le problème que vous voyez est dû à des classes imbriquées ayant le même nom que les classes parent selon le lien fourni:

Ensuite, vous pouvez contourner ce problème en utilisant un fichier de liaisons externes:

recursive.xml

Le fichier de liaison vous permet de renommer les classes imbriquées pour éviter le conflit de noms.

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:bindings schemaLocation="recursive.xsd"> 
     <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType"> 
      <jaxb:class name="Topic2"/> 
     </jaxb:bindings> 
     <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType"> 
      <jaxb:class name="Topic3"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

recursive.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="topic"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="topic" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="topic" minOccurs="1" maxOccurs="1"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="topic" minOccurs="0" maxOccurs="unbounded" type="xs:string"/> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

XJC appel

Le fichier de liaison est spécifié dans l'appel de XJC:

xjc -d out -b recursive.xml recursive.xsd 

Sujet (Gener Classe Ated)

package generated; 

import java.util.ArrayList; 
import java.util.List; 
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; 


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

    @XmlElement(required = true) 
    protected Topic.Topic2 topic; 

    public Topic.Topic2 getTopic() { 
     return topic; 
    } 

    public void setTopic(Topic.Topic2 value) { 
     this.topic = value; 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "topic" 
    }) 
    public static class Topic2 { 

     @XmlElement(required = true) 
     protected Topic.Topic2 .Topic3 topic; 

     public Topic.Topic2 .Topic3 getTopic() { 
      return topic; 
     } 

     public void setTopic(Topic.Topic2 .Topic3 value) { 
      this.topic = value; 
     } 

     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "", propOrder = { 
      "topic" 
     }) 
     public static class Topic3 { 

      protected List<String> topic; 

      public List<String> getTopic() { 
       if (topic == null) { 
        topic = new ArrayList<String>(); 
       } 
       return this.topic; 
      } 

     } 

    } 

} 
Questions connexes