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

  • 实例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;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据

所谓图片元数据,就是除了我们肉眼看到的图片内容外,隐藏在这些内容背后的一些技术数据。

1594
来自专栏desperate633

LeetCode Fizz Buzz题目分析代码

Write a program that outputs the string representation of numbers from 1 to n.

831
来自专栏码匠的流水账

聊聊storm的WindowedBolt

storm-2.0.0/storm-client/src/jvm/org/apache/storm/topology/IWindowedBolt.java

2444
来自专栏mukekeheart的iOS之旅

No.009 Palindrome Number

9. Palindrome Number Total Accepted: 136330 Total Submissions: 418995 Difficulty...

2317
来自专栏编舟记

命令式到函数式编程

应用场景:当我们用到 if-elseif-else 的时候,可以考虑使用 Optional 语义。 举例说明:

782
来自专栏高性能服务器开发

(三)dict哈希结构3

/* This function performs just a step of rehashing, and only if there are * no...

2818
来自专栏函数式编程语言及工具

FunDA(1)- Query Result Row:强类型Query结果行

    FunDA的特点之一是以数据流方式提供逐行数据操作支持。这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题。为了实现安全高效的数据...

2039
来自专栏java、Spring、技术分享

深入分析Spring MVC中RequestBody与ResponseBody

  在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换。在Sprin...

2791
来自专栏小樱的经验随笔

Code forces 719A Vitya in the Countryside

A. Vitya in the Countryside time limit per test:1 second memory limit per test:2...

3556
来自专栏码匠的流水账

springboot2自定义statsd指标前缀

springboot2引入了micrometer,1.x版本的spring.metrics.export.statsd.prefix在2版本中已经被标记为废弃,...

1462

扫码关注云+社区

领取腾讯云代金券