最新开发项目时遇到了一个需要解析XML的场景,此文用于记录开发过程遇到的一些问题和经验
一、常用注解
此处只记录一些较为必用的注解和属性,想看全又详细的可以参考
1.@XmlRootElement(name="XXX")
用于标识从根节点,即从XML的哪个节点开始解析,在类名上标识
2.@XmlElement(name="XXX")
用于标识字段对应的根节点,在字段/get/set上标识
3.@XmlElementWrapper(name="XXX")
为数组或集合定义一个父节点,在字段/get/set上标识
二、举例
以如下XML为示例
<test> <f1>111</f1> <f2>222</f2> <f3>222</f3> <fss> <fs> <ff1>11</ff1> <ff2>22</ff2> <ff3>33</ff3> </fs> <fs> <ff1>44</ff1> <ff2>55</ff2> <ff3>66</ff3> </fs> </fss> </test>
其需要编写的类总共为两个
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; @XmlRootElement(name="test") public class testHead { private String f1; private String f2; private String f3; private List<testFs> fss; @XmlElement(name="f1") public String getF1() { return f1; } public void setF1(String f1) { this.f1 = f1; } @XmlElement(name="f2") public String getF2() { return f2; } public void setF2(String f2) { this.f2 = f2; } @XmlElement(name="f3") public String getF3() { return f3; } public void setF3(String f3) { this.f3 = f3; } @XmlElementWrapper(name="fss") @XmlElement(name="fs") public List<testFs> getFss() { return fss; } public void setFss(List<testFs> fss) { this.fss = fss; } }
import javax.xml.bind.annotation.XmlElement; public class testFs { private String ff1; private String ff2; private String ff3; @XmlElement(name="ff1") public String getFf1() { return ff1; } public void setFf1(String ff1) { this.ff1 = ff1; } @XmlElement(name="ff2") public String getFf2() { return ff2; } public void setFf2(String ff2) { this.ff2 = ff2; } @XmlElement(name="ff3") public String getFf3() { return ff3; } public void setFf3(String ff3) { this.ff3 = ff3; } }
三、XML解析代码
public testHead xmlToJava(String xml) throws JAXBException { StringReader reader = new StringReader(xml); JAXBContext jaxbContext = JAXBContext.newInstance(testHead.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); testHead act = (testHead) jaxbUnmarshaller.unmarshal(reader); return act; }
四、注意事项
1.@XmlRootElement只能存在于JAXBContext.newInstance使用的类中,其余衍生套用的类无需重复声明,不然会报错
2.xml中的<fss>节点由@XmlElementWrapper(name="fss")对应,无实际字段
3.未在XML中标注节点类型的字段尽量使用String类型,不然容易造成解析不到值