Heim  >  Artikel  >  Backend-Entwicklung  >  Java verwendet JAXB, um XML-Beispiele zu betreiben

Java verwendet JAXB, um XML-Beispiele zu betreiben

高洛峰
高洛峰Original
2017-01-11 13:06:251812Durchsuche

Definieren Sie zunächst zwei Beispielklassen, ClassA und ClassB, für nachfolgende Beispieldemonstrationen

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
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

XmlUtil für die Serialisierung

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

wird wie folgt aufgerufen:

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

Das Ausgabeergebnis lautet wie folgt:

<?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>

Die folgenden Punkte sollten hier beachtet werden

1 Fügen Sie der zu serialisierenden Klasse die Annotation @XmlRootElement hinzu, andernfalls ein Fehler wird gemeldet (Fehler Die Eingabeaufforderung ist sehr klar, daher werde ich sie hier nicht veröffentlichen)

2 Wenn JAXB XML serialisiert, werden Getter und Setter standardmäßig serialisiert, und Getter und Setter müssen paarweise erscheinen serialisierte

3 Attribute Name, standardmäßig werden die ersten Buchstaben der serialisierten Klassen- und Attributnamen in Kleinbuchstaben umgewandelt. Wenn Sie den Attributnamen steuern müssen, müssen Sie @XmlElement(name="ClassAId") verwenden Hier ist zu beachten, dass der Getter oder Setter den Namen angeben muss @XmlElement Es kann auf dem Getter oder Setter platziert werden, aber nur einer kann platziert werden, was bedeutet, dass die Annotation @XmlElement nicht sowohl auf dem Getter als auch auf dem Setter verwendet werden kann Setter gleichzeitig

4 Wie steuere ich den Namen des Wurzelknotens?
Verwenden Sie @XmlRootElement, um das Namensattribut anzugeben, z. B. @XmlRootElement(name="ClassA")

5 So fügen Sie einen Namespace hinzu
Verwenden Sie @XmlRootElement(namespace="cn.lzrabbit") um die Namespace-Attribute anzugeben

6 So steuern Sie jeden Attributnamen genau
JAXB wandelt den ersten Buchstaben automatisch in Kleinbuchstaben um, was dazu führt, dass unvorhersehbare Attributnamen angezeigt werden. Wenn dies kein Problem darstellt, legen Sie @XmlElement( fest. name="") für jedes Attribut, wenn Sie Ärger sparen möchten, verwenden Sie Field

7 So verwenden Sie das Field-Feld anstelle von Setter und Getter beim Serialisieren
Fügen Sie @XmlAccessorType(XmlAccessType.FIELD) hinzu. Annotation zur zu verwendenden Klasse hinzufügen und angeben. Für XmlAccessType.FIELD wird dringend empfohlen, die Annotation @XmlAccessorType(XmlAccessType.FIELD) zu verwenden, da Sie auf diese Weise den Namen jedes Elements präzise steuern können, ohne das @XmlElement festlegen zu müssen (name="")-Annotation für jedes Attribut. Natürlich können Sie auch die @XmlElement-Annotation für das Feld verwenden

Das Folgende ist ein Codebeispiel mit der obigen Annotation

@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;
    }
}

Die Ausgabe-XML ist

<?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>

Mehr Bitte beachten Sie die PHP-Chinese-Website für verwandte Artikel zu mehreren Java-Beispielen mit JAXB zum Betrieb von XML-Beispielen!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn