【常用功能】使用xstream完成xml、对象互转

xml格式转为object对象,分三种情况:

1、常规标签格式转化

2、标签属性格式转化

3、两种方式相结合的xml格式转化

备注:需要用到的jar包 xstream,xpp3

一、常规标签格式转化

主要使用xstream中 @XStreamAlias 标签,将xml标签和实体类属性进行一一对应后,使用util类转化方法进行转化即可。

xml格式如下:

<User>
  <userName>lanweihong</userName>
  <email>lwhhhp@gmail.com</email>
</User>
User.java
@XStreamAlias("User")
public class User {

    @XStreamAlias("userName")
    private String userName;
    
    @XStreamAlias("email")
    private String email;

}
转化方式:
User user = XmlUtils.xmlToObject(xmlStr);

二、标签属性格式转化

主要使用xstream中 @XStreamAsAttribute@XStreamImplicit 标签,将xml标签的属性和实体类属性进行一一对应后进行转化即可。

xml格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<info id="200000000002" type="general_log_info" resultnum="40000">
	<log SeviceGroup="15" SeviceType="401" User-Agent="1"></log>
	<log SeviceGroup="16" SeviceType="402" User-Agent="2"></log>
</info>
Info.java

最外层标签使用 @XStreamAlias 对应实体类名

标签属性使用 @XStreamAsAttribute 对应实体类属性(字段名称必须一致)

内层集合标签使用 @XStreamImplicit(itemFieldName = “log”) 对应实体类集合属性

@XStreamAlias("info")
public class HttpInfoVo {

    @XStreamAsAttribute
    private String id;

    @XStreamAsAttribute
    private String type;

    @XStreamAsAttribute
    private String resultnum;

    @XStreamImplicit(itemFieldName = "log")
    private List<HttpLogVo> logs = new ArrayList<HttpLogVo>();
}
Log.java
@XStreamAlias("log")
public class HttpLogVo {

    @XStreamAsAttribute
    private String SeviceGroup;

    @XStreamAsAttribute
    private String SeviceType;

    @XStreamAsAttribute
    private String userAgent;

}
转化方法

因为实体类属性不能使用"-“这类特殊符号,所以讲xml读取后要将带有”-"的字段进行转化(如User-Agent转为userAgent,转化后的字段保持与实体类字段一致即可)

XStream xstream = new XStream(new DomDriver());
xstream.autodetectAnnotations(true);
xstream.processAnnotations(Info.class);
xmlStr = xmlStr.replaceAll("User-Agent","userAgent");

Info info = (Info) xstream.fromXML(xmlStr);

三、两种xml格式相结合的xml转化

xml样例如下:

<?xml version="1.0" encoding="UTF-8"?>
<info id="200000000002" type="general_log_info" resultnum="40000">
    <log SeviceGroup="15" SeviceType="401" User-Agent="1">
        <id>1</id>
        <name>test</name>
    </log>
    <log SeviceGroup="16" SeviceType="402" User-Agent="2"></log>
</info>

此时只需针对内层的标签添加 @XStreamAlias 对应实体类属性名即可

更改后的Log.java
@XStreamAlias("log")
public class HttpLogVo {

    @XStreamAsAttribute
    private String SeviceGroup;

    @XStreamAsAttribute
    private String SeviceType;

    @XStreamAsAttribute
    private String userAgent;
    
    @XStreamAlias("id")
    private String id;
    
    @XStreamAlias("name")
    private String name;

}

四、自定义xml解析(性能最好)

引入maven依赖

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

代码示例

private HttpInfoVo getLogsByXml(String line) {
        InputStream in = new ByteArrayInputStream(line.getBytes());
        SAXReader reader = new SAXReader();
        Document doc = null;
        Element root = null;
        try {
            doc = reader.read(in);
            root = doc.getRootElement();
        } catch (DocumentException e) {
            logger.info("xml文件读取失败!",e);
        }

        HttpInfoVo info = new HttpInfoVo();
        List<HttpLogVo> logVos = new ArrayList<>();
        if("info".equals(root.getName())) {
            //获取info标签中的type属性值,用于区分http和gene话单
            String type = root.attributeValue("type");
            info.setType(type);
            List<Element> elements = root.elements();
            for (Element element : elements) {
                if ("log".equals(element.getName())) {
                    HttpLogVo log = new HttpLogVo();
                    log.setMsisdn(element.attributeValue("MSISDN"));
                    log.setSeviceGroup(element.attributeValue("SeviceGroup"));
                    log.setSeviceType(element.attributeValue("SeviceType"));
                    String imsi = element.attributeValue("IMSI");
                    String imei = element.attributeValue("IMEI");
                    log.setIMSIIMEI(imsi+"/"+imei);
                    log.setApn(element.attributeValue("APN"));
                    log.setNetType(element.attributeValue("NetType"));
                    log.setSgsnIp(element.attributeValue("SGSN_IP"));
                    log.setSgsnPort(element.attributeValue("SGSN_PORT"));
                    log.setGgsnIp(element.attributeValue("GGSN_IP"));
                    log.setGgsnPort(element.attributeValue("GGSN_PORT"));
                    log.setsIP(element.attributeValue("SIP"));
                    log.setSport(element.attributeValue("Sport"));
                    log.setdIP(element.attributeValue("DIP"));
                    log.setDport(element.attributeValue("Dport"));
                    log.setDate(element.attributeValue("Date"));
                    log.setUserAgent(element.attributeValue("User-Agent"));
                    log.settVendor(element.attributeValue("TVENDOR"));
                    log.settModel(element.attributeValue("TMODEL"));
                    log.settType(element.attributeValue("TTYPE"));
                    if ("http_log_info".equals(type)) {
                        log.setUrl(element.attributeValue("URL"));
                        log.setHost(element.attributeValue("Host"));
                        log.setxOnlineHost(element.attributeValue("X-online-Host"));
                        log.setContentType(element.attributeValue("Content-Type"));
                        log.setHttpCmd(element.attributeValue("HTTP-CMD"));
                        log.setContentLength(element.attributeValue("Content-Length"));
                    }
                    logVos.add(log);
                }
            }

            //log节点解析完毕后
            info.setLogs(logVos);
        }
        return info;
    }
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XStream库实现XML对象之间的互转可以通过以下步骤完成: 1. 引入XStream库的依赖:在你的项目中引入XStream库的依赖,可以参考我之前提供的Maven和Gradle配置。 2. 定义Java类:创建一个Java类来表示你的对象,并使用XStream提供的注解来指定XML元素和属性与Java类的映射关系。例如: ```java import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("person") public class Person { private String name; private int age; // 省略构造函数、getter和setter方法 // ... } ``` 3. 将对象转换为XML使用XStream将Java对象转换为XML字符串。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // 创建一个Person对象 Person person = new Person(); person.setName("John"); person.setAge(30); // 将Person对象转换为XML字符串 String xml = xStream.toXML(person); // 输出XML字符串 System.out.println(xml); } } ``` 以上代码将输出以下XML字符串: ```xml <person> <name>John</name> <age>30</age> </person> ``` 4. 将XML转换为对象使用XStreamXML字符串转换回Java对象。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // XML字符串 String xml = "<person><name>John</name><age>30</age></person>"; // 将XML转换为Person对象 Person person = (Person) xStream.fromXML(xml); // 输出Person对象的属性 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } } ``` 以上代码将输出: ``` Name: John Age: 30 ``` 通过以上步骤,你可以使用XStream实现XML对象之间的互转。你可以根据具体的需求对Java类和XML结构进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值