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
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 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
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
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>
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; } }
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>
Plus Veuillez faire attention au site Web PHP chinois pour les articles connexes sur plusieurs Java utilisant jaxb pour exploiter des exemples XML !