浅谈XML 解析技术(五) Jaxb解析

来源:互联网 发布:收看日本电视台软件 编辑:程序博客网 时间:2024/06/13 13:38

1.【项目包结构如图】 bean 目录下的bean是由xjc 命令根据xsd 文件生成的对象,具体反转方法参见笔者的另一篇博客:xml--> javabean

【2. students_jaxb.xml】

<?xml version="1.0" encoding="UTF-8"?><Students>    <Student grade="2">        <Name>zong_0</Name>        <Age>20</Age>        <Sex>boy</Sex>        <Number>1000</Number>        <Address>beijing No.0</Address>    </Student>    <Student grade="1">        <Name>zong_1</Name>        <Age>21</Age>        <Sex>girl</Sex>        <Number>1001</Number>        <Address>beijing No.1</Address>    </Student>    <Student grade="2">        <Name>zong_2</Name>        <Age>22</Age>        <Sex>boy</Sex>        <Number>1002</Number>        <Address>beijing No.2</Address>    </Student>    <Student grade="1">        <Name>zong_3</Name>        <Age>23</Age>        <Sex>girl</Sex>        <Number>1003</Number>        <Address>beijing No.3</Address>    </Student>    <Student grade="2">        <Name>zong_4</Name>        <Age>24</Age>        <Sex>boy</Sex>        <Number>1004</Number>        <Address>beijing No.4</Address>    </Student>    <Student grade="1">        <Name>zong_5</Name>        <Age>25</Age>        <Sex>girl</Sex>        <Number>1005</Number>        <Address>beijing No.5</Address>    </Student>    <Student grade="2">        <Name>zong_6</Name>        <Age>26</Age>        <Sex>boy</Sex>        <Number>1006</Number>        <Address>beijing No.6</Address>    </Student>    <Student grade="1">        <Name>zong_7</Name>        <Age>27</Age>        <Sex>girl</Sex>        <Number>1007</Number>        <Address>beijing No.7</Address>    </Student>    <Student grade="2">        <Name>zong_8</Name>        <Age>28</Age>        <Sex>boy</Sex>        <Number>1008</Number>        <Address>beijing No.8</Address>    </Student>    <Student grade="1">        <Name>zong_9</Name>        <Age>29</Age>        <Sex>girl</Sex>        <Number>1009</Number>        <Address>beijing No.9</Address>    </Student></Students>

【2. JaxbUtils: jaxb 解析工具类】

package org.zgf.xml.jaxb;import java.io.ByteArrayInputStream;import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;/** * @Description: xml 解析工具类 * @author zonggf * @date 2015年10月29日-下午1:27:08 */public class JaxbUtlis {private static String ENCODING = "UTF-8";private static void setENCODING(String encoding){ENCODING = encoding;}/** * @Description  将xml 文件转换成对象 * @param xmlxml片段 * @param T要转换的对象类名称 * @return T * @author zonggf * @date 2015年10月29日-下午1:27:48 */    @SuppressWarnings("unchecked")    public static <T> T unmarshall(String xml, Class<T> T)    {        try  {            JAXBContext jaxbContext = JAXBContext.newInstance(T);            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();                        T re = (T) unmarshaller.unmarshal(new ByteArrayInputStream(xml.getBytes(ENCODING)));            return re;        }        catch (Exception ex)  {        ex.printStackTrace();        }        return null;    }    /**     * @DescriptionjavaBean 对象转换成xml字符串     * @param obj 要转换的JavaBean对象     * @return String     * @author zonggf     * @date 2015年10月29日-下午1:28:26     */    public static String marshall(Object obj)    {        try {            JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());            Marshaller marshaller = jaxbContext.createMarshaller();            marshaller.setProperty(Marshaller.JAXB_ENCODING, ENCODING);            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,                    Boolean.TRUE);            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);                        StringWriter stringWriter = new StringWriter();            marshaller.marshal(obj, stringWriter);            return stringWriter.toString();        }        catch (Exception ex)  {        ex.printStackTrace();        }        return null;    }}

【3. JaxbParseXml】

package org.zgf.xml.jaxb;import java.util.ArrayList;import java.util.List;import org.junit.Test;import org.zgf.util.FileTextUtil;import org.zgf.xml.jaxb.bean.Student;import org.zgf.xml.jaxb.bean.Students;/** * @Description:   将 xml 文档转换成javabean 对象 * @author zonggf * @date 2015年10月29日-下午1:44:15 */public class JaxbParseXml {private static String fileName = "xml/students_jaxb.xml";/** 初始化studentList 对象 */private static List<Student> initStudents() {List<Student> students = new ArrayList<>();for (int i = 0; i < 10; i++) {Student student = new Student();student.setNumber("100" + i);student.setName("zong_" + i);student.setAge("" + (20 + i));if (i % 2 == 0) {student.setGrade("2");student.setSex("boy");} else {student.setGrade("1");student.setSex("girl");}student.setAddress("beijing No." + i);students.add(student);}return students;}/** 测试生成xml  */@Testpublic void test_createXMLFile(){Students students = new Students();students.setStudent(initStudents());String xmlContent = JaxbUtlis.marshall(students);String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";//写入文件FileTextUtil.string2File(fileName, xmlHeader + xmlContent);System.out.println("finish...");}/** 测试读取xml */@Testpublic void test_readXMLFile() {String xmlStr = FileTextUtil.txtFile2String(fileName);Students students = JaxbUtlis.unmarshall(xmlStr, Students.class);List<Student> studentList = students.getStudent();for (Student student : studentList) {System.out.println(student);}}}

【注:源代码下载 D_parse_xml.zip】

1 0