5 votes

Le démarshalling XML de JAXB ne voit que l'élément Root.

J'ai un problème de démarchage d'un document XML assez simple vers des objets Java simples.

Voici à quoi ressemble mon XML :

<?xml version="1.0" encoding="UTF-8"?>
<codeSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 vocab.xsd" xmlns="urn:hl7-org:v3">
     <name>RoleCode</name>
     <desc>Codes voor rollen</desc>
     <code code="SON" codeSystem="2.16.840.1.113883.5.111" displayName="natural sonSon ">
         <originalText>The player of the role is a male offspring of the scoping entity (parent).</originalText>
     </code>
     <code code="DAUC" codeSystem="2.16.840.1.113883.5.111" displayName="Daughter">
           <originalText> The player of the role is a female child (of any type) of scoping entity (parent) </originalText>
     </code>
</codeSystem>

Il fait partie d'un fichier beaucoup plus important, une spécification du système de code Hl7v3 pour représenter les relations entre les personnes.

J'ai créé deux classes Java pour les éléments CodeSystem et Code :

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class CodeSystem
{
    private String name;

    private String desc;

    @XmlElement(name = "code")
    private List<Code> codes;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class Code
{
    @XmlAttribute
    private String code;

    @XmlAttribute
    private String codeSystem;

    @XmlAttribute
    private String displayName;

    private String originalText;
}

J'ai ajouté un package-info.java contenant :

@XmlSchema(
    namespace = "urn:hl7-org:v3",  
    elementFormDefault = XmlNsForm.UNQUALIFIED, 
    attributeFormDefault = XmlNsForm.UNQUALIFIED,
    xmlns = { 
        @javax.xml.bind.annotation.XmlNs(prefix = "", namespaceURI = "urn:hl7-org:v3") 
    }
)
package nl.topicuszorg.hl7v3.vocab2enum.model;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Le démarchage est assez simple :

JAXBContext context = JAXBContext.newInstance(CodeSystem.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
CodeSystem codeSystem = (CodeSystem) unmarshaller.unmarshal(new File(args[0]));

Cela donne toutefois lieu à un objet CodeSystem vide. Rien, à l'exception de l'élément Root, n'est analysé à partir du XML.

Je n'arrive pas à comprendre pourquoi les éléments nom, desc et code ne sont pas reconnus. Résident-ils dans un espace de noms différent de celui de l'élément Root ? Ils ne devraient pas l'être, car la déclaration d'espace de noms dans l'élément Root n'est pas fixée.

Qu'est-ce que je rate ?

9voto

Blaise Doughan Points 75613

Dans votre document XML, vous avez spécifié un espace de nom par défaut. Cela signifie que tout élément non préfixé sera dans cet espace de noms. Dans le fragment ci-dessous, les deux éléments codeSystem y name sont qualifiés avec l'élément urn:hl7-org:v3 espace de noms.

<codeSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 vocab.xsd" xmlns="urn:hl7-org:v3">
     <name>RoleCode</name>
     ...
</codeSystem>

Il suffit de modifier le elementFormDefault sur la propriété @XmlSchema à l'annotation XmlNsForm.QUALIFIED . Vous l'avez actuellement en tant que XmlNsForm.UNQUALIFIED ce qui signifie que seuls les éléments globaux seront qualifiés d'espace de nom (celui correspondant à l'élément @XmlRootElement dans votre cas d'utilisation.

@XmlSchema(
    namespace = "urn:hl7-org:v3",  
    elementFormDefault = XmlNsForm.QUALIFIED, 
    attributeFormDefault = XmlNsForm.UNQUALIFIED,
    xmlns = { 
        @javax.xml.bind.annotation.XmlNs(prefix = "", namespaceURI = "urn:hl7-org:v3") 
    }
)
package nl.topicuszorg.hl7v3.vocab2enum.model;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Pour plus d'informations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X