Primero, defina dos clases de ejemplo ClassA y ClassB para demostraciones de ejemplo posteriores
La copia del código es la siguiente:
paquete cn.lzrabbit;
clase pública clase {
privado int classaid;
cadena privada classaname;
privado classb classb;
public int getClassaid () {
regresar classAid;
}
public void setClassaid (int classaid) {
this.classaid = classaid;
}
Cadena pública getClassaname () {
devolver classaname;
}
public void setClassaname (String classaname) {
this.classaname = classaname;
}
public classb getClassb () {
devolver classb;
}
public void setClassb (classb classb) {
this.classb = classb;
}
}
Clase
La copia del código es la siguiente:
paquete cn.lzrabbit;
clase pública classb {
privado int classbid;
String private ClassBName;
public int getClassbid () {
return classbid;
}
public void setClassbid (int classbid) {
this.classbid = classbid;
}
Cadena pública getClassBName () {
return classBName;
}
public void setClassBName (string classBName) {
this.classbName = classBName;
}
}
ClaseB
Xmlutilo para la serialización
La copia del código es la siguiente:
paquete cn.lzrabbit;
import java.io.stringreader;
import java.io.stringwriter;
import javax.xml.bind.*;
clase pública xmlutil {
public static string toxml (object obj) {
intentar {
JaxbContext context = jaxbContext.newinStance (obj.getClass ());
Marshaller Marshaller = context.CreateMarShaller ();
Marshaller.setProperty (Marshaller.jaxb_encoding, "UTF-8"); // // Formato de codificación
Marshaller.setProperty (marshaller.jaxb_formatted_output, true); // si se debe formatear la cadena XML generada
Marshaller.setProperty (marshaller.jaxb_fragment, falso); // si omitir la información de la declaración del encabezado XM
Stringwriter escritor = new StringWriter ();
Marshaller.Marshal (OBJ, escritor);
return writer.ToString ();
} capt (excepción e) {
tirar nueva runtimeException (e);
}
}
@SupessWarnings ("sin control")
public static <t> t fromxml (string xml, class <t> valueType) {
intentar {
JaxbContext context = jaxbContext.newinStance (valueType);
Unmarshaller unmarshaller = context.createUnmarshaller ();
return (t) unmarshaller.unmarshal (new StringReader (xml));
} capt (excepción e) {
tirar nueva runtimeException (e.getMessage ());
}
}
}
Xmlutilo
La llamada es la siguiente:
La copia del código es la siguiente:
paquete cn.lzrabbit;
clase pública 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
El resultado de salida es el siguiente:
La copia del código es la siguiente:
<? xml versión = "1.0" encoding = "utf-8" standalone = "sí"?>
<claSa>
<ScaseAid> 11 </scaseid>
<classaname> a1 </classaname>
<classb>
<classbid> 22 </classbid>
<ClassBName> B2 </classbname>
</sclassb>
</scase>
Aquí hay algunos puntos a tener en cuenta
1. Agregue la anotación @xmlrootelement a la clase serializada, de lo contrario se informará un error (el mensaje de error está muy claro, por lo que no lo publicaré aquí)
2Jaxb esializa a Getters y Setters de forma predeterminada al serializar XML, y los Getters y Setters deben aparecer en pares antes de ser serializados.
3 nombres de atributos. A lo que debe prestar atención aquí es @xmlelement se puede colocar en Getter o Setter, pero solo se puede colocar uno, lo que significa que la anotación @XMLELEMENT no se puede usar en Getter y Setter al mismo tiempo
4 ¿Cómo controlar el nombre del nodo raíz?
Use @xmlrootelement para especificar el atributo de nombre, como @xmlrootelement (name = "classa")
5 Cómo agregar un espacio de nombres para especificar el atributo del espacio de nombres usando @xmlrootelement (Namespace = "CN.LZRABBIT")
6 Cómo controlar con precisión cada nombre del atributo
La conversión automática de Jaxb a la primera letra minúscula provocará que aparezcan nombres de atributos impredecibles.
7 Cómo implementar la serialización utilizando campos de campo en lugar de setters y getters
Agregue la anotación @xmlaccessortype (xmlaccesstype.field) en la clase que desea usar y especifique como xmlaccesstype.field. .
El siguiente es un ejemplo de código utilizando la anotación anterior
La copia del código es la siguiente:
@Xmlrootelement (Namespace = "CN.LZRABBIT")
@Xmlaccessortype (xmlaccesstype.field)
clase pública clase {
privado int classaid;
@Xmlelement (name = "classaname")
cadena privada classaname;
privado classb classb;
public int getClassaid () {
regresar classAid;
}
public void setClassaid (int classaid) {
this.classaid = classaid;
}
Cadena pública getClassaname () {
devolver classaname;
}
public void setClassaname (String classaname) {
this.classaname = classaname;
}
public classb getClassb () {
devolver classb;
}
public void setClassb (classb classb) {
this.classb = classb;
}
}
@Xmlrootelement
@Xmlaccessortype (xmlaccesstype.field)
clase pública classb {
privado int classbid;
String private ClassBName;
public int getClassbid () {
return classbid;
}
public void setClassbid (int classbid) {
this.classbid = classbid;
}
Cadena pública getClassBName () {
return classBName;
}
public void setClassBName (string classBName) {
this.classbName = classBName;
}
}
El XML de salida es
La copia del código es la siguiente:
<? xml versión = "1.0" encoding = "utf-8" standalone = "sí"?>
<ns2: classA xmlns: ns2 = "cn.lzrabbit">
<ScaseAid> 11 </scaseid>
<classaname> a1 </classaname>
<classb>
<classbid> 22 </classbid>
<ClassBName> B2 </classbname>
</sclassb>
</ns2: classa>
PD: Aquí hay algunas herramientas en línea para su referencia:
Herramienta de conversión mutua XML/JSON en línea:
http://tools.vevb.com/code/xmljson
Formato XML en línea/Compress XML en línea:
http://tools.vevb.com/code/xmlformat
XML Herramientas de compresión/formato en línea:
http://tools.vevb.com/code/xml_format_compress