web-dev-qa-db-fra.com

Mappage d'entités XML à Java Objects

Je suis tout à fait sûr, c'est l'une des nombreuses questions dupliquées autour de XML pour Java Conversions d'objets. Mais j'ai commencé ce fil car je ne pouvais pas trouver plus simple ou chercher une solution plus simple.

J'ai un xsd [En fait je le conçois] et xml. Je voudrais mapper automatiquement les données xml sur Java beans selon le mappage

<tns:SummaryCart xmlns:tns="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd">
    <SummaryElement type="test">
        <order>1</order>
        <id>A</id>
        <displayName>A</displayName>
        <subElements>
            <order>1</order>
            <id>Preactivation</id>
            <displayName>Preactivation</displayName>
        </subElements>
        <maxlines>1</maxlines>
    </SummaryElement>
</tns:SummaryCart>

Maintenant mes Java seront

public class SummaryCart{
    private List<SummaryElement> summaryElementList;
}
public class SummaryElement {
    private int order;
    private String id;
    private String displayName;
    private String property;
    private List<SummaryElement> subElements;
    private int maxlines;
    private String type;
}

Existe-t-il un outil/framework simple qui peut mapper automatiquement les données de XML vers Java beans [DOIT prendre en charge le mappage d'attributs/d'éléments]. Le tutoriel sera bon.

Btw, j'utilise le framework Spring, si un avantage spring-oxm est utilisé, son accueil.

19
Reddy

Vous trouverez ci-dessous comment mapper votre objet au format XML à l'aide de JAXB (JSR-222) . Une implémentation est incluse dans le JDK/JRE commençant par Java SE 6. JAXB est pris en charge par Spring (voir section 8.5: http://static.springsource.org/spring- ws/site/reference/html/oxm.html )

SummaryCart

import Java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="SummaryCart", namespace="SummaryCart")
@XmlAccessorType(XmlAccessType.FIELD)
public class SummaryCart{

    @XmlElement(name="SummaryElement")
    private List<SummaryElement> summaryElementList;

}

SummaryElement

import Java.util.List;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class SummaryElement {

    private int order;
    private String id;
    private String displayName;
    private String property;
    private List<SummaryElement> subElements;
    private int maxlines;

    @XmlAttribute
    private String type;

}

Démo

import Java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum15881876/input.xml");
        SummaryCart sc = (SummaryCart) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "SummaryCart.xsd");
        marshaller.marshal(sc, System.out);
    }

}

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:SummaryCart xmlns:ns2="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd">
    <SummaryElement type="test">
        <order>1</order>
        <id>A</id>
        <displayName>A</displayName>
        <subElements>
            <order>1</order>
            <id>Preactivation</id>
            <displayName>Preactivation</displayName>
            <maxlines>0</maxlines>
        </subElements>
        <maxlines>1</maxlines>
    </SummaryElement>
</ns2:SummaryCart>
31
bdoughan

Fondamentalement, vous voulez démarsaler votre XML. Voici un didacticiel détaillé qui décrit comment utiliser la commande JAXB xjc pour générer une classe Java à partir du schéma XML . Un maven xjc plugin est également disponible pour votre commodité.

1
Jops