Maison > développement back-end > Tutoriel XML/RSS > Java utilise jaxb pour exploiter un exemple XML

Java utilise jaxb pour exploiter un exemple XML

高洛峰
Libérer: 2017-01-11 13:06:25
original
1939 Les gens l'ont consulté

Définissez d'abord deux exemples de classes, ClassA et ClassB, pour les exemples de démonstrations ultérieurs

package cn.lzrabbit;
public class ClassA {
    private int classAId;
    private String classAName;
    private ClassB classB;
    public int getClassAId() {
        return classAId;
    }
    public void setClassAId(int classAId) {
        this.classAId = classAId;
    }
    public String getClassAName() {
        return classAName;
    }
    public void setClassAName(String classAName) {
        this.classAName = classAName;
    }
    public ClassB getClassB() {
        return classB;
    }
    public void setClassB(ClassB classB) {
        this.classB = classB;
    }
}
ClassA
Copier après la connexion
package cn.lzrabbit;
public class ClassB {
    private int classBId;
    private String classBName;
    public int getClassBId() {
        return classBId;
    }
    public void setClassBId(int classBId) {
        this.classBId = classBId;
    }
    public String getClassBName() {
        return classBName;
    }
    public void setClassBName(String classBName) {
        this.classBName = classBName;
    }
}
ClassB
Copier après la connexion

XmlUtil pour la sérialisation

package cn.lzrabbit;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.*;
public class XmlUtil {
    public static String toXML(Object obj) {
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm头声明信息
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    @SuppressWarnings("unchecked")
    public static <T> T fromXML(String xml, Class<T> valueType) {
        try {
            JAXBContext context = JAXBContext.newInstance(valueType);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}
XmlUtil
Copier après la connexion

est appelé comme suit :

package cn.lzrabbit;

public class MainRun {
    /**
     * @param args
     */
    public static void main(String[] args) {
        ClassB classB = new ClassB();
        classB.setClassBId(22);
        classB.setClassBName("B2");
        ClassA classA = new ClassA();
        classA.setClassAId(11);
        classA.setClassAName("A1");
        classA.setClassB(classB);
        System.out.println(XmlUtil.toXML(classA));
    }
}
MainRun
Copier après la connexion

Le résultat de sortie est le suivant :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<classA>
    <classAId>11</classAId>
    <classAName>A1</classAName>
    <classB>
        <classBId>22</classBId>
        <classBName>B2</classBName>
    </classB>
</classA>
Copier après la connexion

Les points suivants sont à noter ici

1 Ajoutez l'annotation @XmlRootElement à la classe à sérialiser, sinon une erreur sera signalé (erreur L'invite est très claire, donc je ne la publierai pas ici)

2 Lorsque JAXB sérialise XML, les getters et les setters sont sérialisés par défaut, et les getters et les setters doivent apparaître par paires pour être

3 attributs sérialisés Nom, par défaut, les noms de classe et d'attribut sérialisés ont la première lettre convertie en minuscule. Si vous devez contrôler le nom de l'attribut, vous devez utiliser @XmlElement(name="ClassAId") sur. le getter ou le setter pour spécifier le nom. Ce qu'il faut noter ici est @XmlElement. Il peut être placé sur le getter ou le setter, mais un seul peut être placé, ce qui signifie que l'annotation @XmlElement ne peut pas être utilisée à la fois sur le getter et sur le setter. setter en même temps

4 Comment contrôler le nom du nœud racine ?
Utilisez @XmlRootElement pour spécifier l'attribut de nom, tel que @XmlRootElement(name="ClassA")

5 Comment ajouter un espace de noms
Utilisez @XmlRootElement(namespace="cn.lzrabbit") pour spécifier les attributs de l'espace de noms

6 Comment contrôler avec précision chaque nom d'attribut
JAXB convertit automatiquement la première lettre en minuscule, ce qui entraînera l'apparition de noms d'attribut imprévisibles. Si cela n'est pas gênant, définissez @XmlElement(. name="") pour chaque attribut. , si vous souhaitez éviter les problèmes, utilisez Field

7 Comment utiliser le champ Field au lieu d'utiliser setter et getter lors de la sérialisation
Ajouter @XmlAccessorType(XmlAccessType.FIELD) à la classe à utiliser, et spécifiez Pour XmlAccessType.FIELD, il est fortement recommandé d'utiliser l'annotation @XmlAccessorType(XmlAccessType.FIELD), car de cette façon vous pouvez contrôler précisément le nom de chaque élément sans avoir à définir le @XmlElement (name="") pour chaque attribut Bien sûr, vous pouvez également utiliser l'annotation @XmlElement sur le champ

Ce qui suit est un exemple de code utilisant l'annotation ci-dessus

@XmlRootElement(namespace="cn.lzrabbit")
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassA {
    private int classAId;
    
    @XmlElement(name="ClassAName")
    private String classAName;
    private ClassB classB;
    public int getClassAId() {
        return classAId;
    }
    public void setClassAId(int classAId) {
        this.classAId = classAId;
    }
    public String getClassAName() {
        return classAName;
    }
    public void setClassAName(String classAName) {
        this.classAName = classAName;
    }
    public ClassB getClassB() {
        return classB;
    }
    public void setClassB(ClassB classB) {
        this.classB = classB;
    }
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassB {
    private int ClassBId;
    private String ClassBName;
    public int getClassBId() {
        return ClassBId;
    }
    public void setClassBId(int classBId) {
        this.ClassBId = classBId;
    }
    public String getClassBName() {
        return ClassBName;
    }
    public void setClassBName(String classBName) {
        this.ClassBName = classBName;
    }
}
Copier après la connexion

Le fichier XML de sortie est

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:classA xmlns:ns2="cn.lzrabbit">
    <classAId>11</classAId>
    <ClassAName>A1</ClassAName>
    <classB>
        <ClassBId>22</ClassBId>
        <ClassBName>B2</ClassBName>
    </classB>
</ns2:classA>
Copier après la connexion

Plus Veuillez faire attention au site Web PHP chinois pour les articles connexes sur plusieurs Java utilisant jaxb pour exploiter des exemples XML !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal