Definieren Sie zunächst zwei Beispielklassen Classa und ClassB für nachfolgende Beispieldemonstrationen
Die Codekopie lautet wie folgt:
Paket cn.lzrabbit;
öffentliche Klasse Classa {
private int classaid;
private String Classaname;
private classb classb;
public int getClassaid () {
Rückkehrklasse;
}
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
Die Codekopie lautet wie folgt:
Paket cn.lzrabbit;
öffentliche Klasse classb {
privat 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 zur Serialisierung
Die Codekopie lautet wie folgt:
Paket cn.lzrabbit;
Import Java.io.StringReader;
Import Java.io.StringWriter;
importieren javax.xml.bind.*;
public class xmlutil {
public static String toxml (Objekt obj) {
versuchen {
JaxbContext context = jaxbContext.newinstance (obj.getClass ());
Marshaller Marshaller = context.CreateMarshaller ();
Marshaller.setProperty (Marshaller.jaxb_encoding, "UTF-8"); // // Codierungsformat
Marshaller.setProperty (Marshaller.jaxb_Formatted_output, true); // Ob die generierte XML -Zeichenfolge formatiert werden soll
Marshaller.SetProperty (Marshaller.jaxb_Fragment, Falsch); // Ob die XM -Header -Deklarationsinformationen weglassen
StringWriter writer = new StringWriter ();
Marshaller.Marshal (OBJ, Schriftsteller);
return writer.tostring ();
} catch (Ausnahme e) {
neue runimeexception (e) werfen;
}
}
@Suppresswarnings ("Unbekämpft")
public static <t> T fromxml (String xml, Klasse <T> Valuetype) {
versuchen {
JaxbContext context = jaxbContext.Newinstance (Valuetyp);
UNMARSHALLER UNMARSHALLER = CONTEXT.CreateUnmarshaller ();
return (t) unmarshaller.unmarshal (neuer StringReader (xml));
} catch (Ausnahme e) {
neue runimeexception (e.getMessage ()) werfen;
}
}
}
Xmlutil
Der Anruf lautet wie folgt:
Die Codekopie lautet wie folgt:
Paket cn.lzrabbit;
öffentliche Klasse 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 ist wie folgt:
Die Codekopie lautet wie folgt:
<? xml Version = "1.0" coding = "utf-8" standalone = "yes"?>
<classa>
<ClassAid> 11 </classaid>
<SclassAname> a1 </classaname>
<classb>
<Sclassbid> 22 </classbid>
<Classbname> B2 </classbname>
</classb>
</classa>
Hier sind einige Punkte zu beachten
1. Fügen Sie die @xmlrootelement -Annotation zur serialisierten Klasse hinzu, andernfalls wird ein Fehler gemeldet (die Fehleraufforderung ist sehr klar, so dass ich sie hier nicht veröffentlichen werde)
2JAXB serialisiert standardmäßig Getter und Setter, wenn er XML serialisiert, und Getter und Setter müssen paarweise vor ihrer Serialisierung erscheinen.
3 Attributnamen. Sie müssen hier @xmlelement auf Getter oder Setter platziert werden, aber nur eine kann platziert werden, was bedeutet, dass @xmlelement Annotation nicht gleichzeitig auf Getter und Setter verwendet werden kann
4Wie den Stammknotennamen steuern?
Verwenden Sie @xmlrootelement, um das Namensattribut wie @xmlrootelement (name = "classa") anzugeben.
5 So fügen Sie einen Namespace hinzu, um das Namespace -Attribut mit @xmlrootelement (Namespace = "cn.lzrabbit") anzugeben.
6 Wie man jeden Attributnamen genau steuert
Das automatische Konvertieren von JAXB in Kleinbuchstaben verursacht unvorhersehbare Attributnamen, wenn Sie sich nicht darum kümmern, @xmlelement (name = "") für jedes Attribut.
7 So implementieren Sie die Serialisierung mit Feldfeldern anstelle von Setzen und Gettern
Fügen Sie die Annotation von @xmlaccessortype (xmlaccessType.field) in der Klasse hinzu, die Sie verwenden möchten. . Anstatt die Annotation von @xmlelement (name = "") für jedes Attribut festzulegen, können Sie natürlich auch die @xmlelement -Annotation auf dem Feld verwenden
Das Folgende ist ein Codebeispiel, das die obige Annotation verwendet
Die Codekopie lautet wie folgt:
@Xmlrootelement (Namespace = "cn.lzrabbit")
@Xmlaccessortype (xmlaccessType.field)
öffentliche Klasse Classa {
private int classaid;
@Xmlelement (name = "classAname")
private String Classaname;
private classb classb;
public int getClassaid () {
Rückkehrklasse;
}
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)
öffentliche Klasse classb {
privat 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;
}
}
Der Ausgang XML ist
Die Codekopie lautet wie folgt:
<? xml Version = "1.0" coding = "utf-8" standalone = "yes"?>
<ns2: classa xmlns: ns2 = "cn.lzrabbit">
<ClassAid> 11 </classaid>
<SclassAname> a1 </classaname>
<classb>
<Sclassbid> 22 </classbid>
<Classbname> B2 </classbname>
</classb>
</ns2: classa>
PS: Hier sind einige Online -Tools für Ihre Referenz:
Online -XML/JSON -Mutual Conversion Tool:
http://tools.vevb.com/code/xmljson
Format XML Online/Compress XML Online:
http://tools.vevb.com/code/xmlformat
XML Online -Komprimierungs-/Formatierungswerkzeuge:
http://tools.vevb.com/code/xml_format_compress