java程序 如何优雅地读取xml文件

895 阅读2分钟
  • 实例xml

<?xml version="1.0" encoding="UTF-8"?>
<c c1="0">
<d d1="101280101" d2="广州" d3="guangzhou" d4="广东"/>
<d d1="101280601" d2="深圳" d3="shenzhen" d4="广东"/>
<d d1="101280701" d2="珠海" d3="zhuhai" d4="广东"/>
<d d1="101280702" d2="斗门" d3="doumen" d4="广东"/>
<d d1="101280703" d2="金湾" d3="jinwan" d4="广东"/>
<d d1="101280800" d2="佛山" d3="foshan" d4="广东"/>
<d d1="101280801" d2="顺德" d3="shunde" d4="广东"/>
<d d1="101280802" d2="三水" d3="sanshui" d4="广东"/>
</c>
  • xml对应实体

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author gaowenfeng
 * @package com.gwf.gwf.weather.basic.vo
 * @describe 天气实体类与xml映射
 * @date 2018/2/20
 */
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
// 以上为lombok注解,方便生成getter/setter方法
@XmlRootElement(name = "d")  // 将类或枚举类型映射到XML元素,d对应的是每一行的标签 名<d d1="101280101" d2="广州" d3="guangzhou" d4="广东"/>
@XmlAccessorType(XmlAccessType.FIELD)  // 控制默认情况下字段还是Javabean属性序列化。
public class City {

    @XmlAttribute(name = "d1")  // 将JavaBean属性映射到XML属性。d1-d4对应的是<d d1="101280101" d2="广州" d3="guangzhou" d4="广东"/> 中的d1-d4
    private String cityId;

    @XmlAttribute(name = "d2")
    private String cityName;

    @XmlAttribute(name = "d3")
    private String cityCode;

    @XmlAttribute(name = "d4")
    private String province;
}

import lombok.Data;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

/**
 * @author gaowenfeng
 * @package com.gwf.gwf.weather.basic.vo
 * @describe 城市列表结合
 * @date 2018/2/21
 */
@Data
@XmlRootElement(name = "c")
@XmlAccessorType(XmlAccessType.FIELD)
public class CityList {

    @XmlElement(name = "d")
    private List<City> cityList;
}
  • 转换Util

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.Reader;
import java.io.StringReader;

/**
 * @author gaowenfeng
 * @package com.gwf.weather.util
 * @describe Xml构建工具
 * @date 2018/2/21
 */
public class XmlBuilter {

    /**
     * 将Xml字符串转化为java对象
     * @param clazz
     * @param xmlStr
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> T xmlStrToObject(Class<T> clazz,String xmlStr) throws Exception{
        Object xmlObject = null;
        // 创建Xml转化实例实例
        JAXBContext context = JAXBContext.newInstance(clazz);

        // XML转化为对象的接口
        Unmarshaller unmarshaller = context.createUnmarshaller();

        try(
                // 将字符串转换为Reader
                Reader reader = new StringReader(xmlStr)
            ){
            // 执行具体的转换逻辑
            xmlObject = unmarshaller.unmarshal(reader);
        }

        return (T)xmlObject;
    }
}