java原生的xml处理类

这篇博客介绍了如何使用Java的原生类将对象转换为格式化的XML字符串,包括对象到XML的转化方法,子对象的处理以及相关测试案例和输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总体介绍:

 @XmlRootElement(name = "root") 该注解是指定根标签,即 <root>...</root>
 @XmlElementWrapper(name = "persons") 表示要包裹的List属性子标签的标签,<persons></persons>,不加的话,默认没有这一层标签。
 @XmlElement(name = "item") 表示对应的属性包裹的标签:<item></item>,不加的话,默认使用属性名
 // 格式化xml输出的格式,true会格式化输出(比较好看,开发时建议打开,上生产建议关闭,因为关闭会省很多空间),false会全部压缩到一起
 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

 // 是否打印xml的说明头 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 // 设置为true表示不打印,设置为false表示打印,默认打印
 marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE);

详细信息如下:

将对象转换成xml字符串的工具类:

package jol;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;

public class TextUtils {

    public static String convertToXml(Object obj)  {
        // 用于打印输出信息
        StringWriter sw = new StringWriter();
        try {
            // 通过传入的类,创建改类的转换上下文
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            //创建实例
            Marshaller marshaller = context.createMarshaller();
            // 格式化xml输出的格式,true会格式化输出,false会全部压缩到一起
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            // 是否打印xml的说明头 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
            // 设置为true表示不打印,设置为false表示打印,默认打印
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE);
            // 将对象转换成输出流形式的xml
            marshaller.marshal(obj, sw);
        } catch (JAXBException e) {
            System.out.println(String.format("错误转换信息,详情%s",e.getMessage()));
        }
        return sw.toString();
    }

}

需要格式化的输出的顶层对象:

package jol;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@XmlAccessorType(XmlAccessType.FIELD)
// XML文件中的根标识,这个可以随便填
@XmlRootElement(name = "root")
// 控制JAXB 绑定类中属性和字段的排序  
public class User implements Serializable {
    private static final long serialVersionUID = 1L;  
  
    // 用户Id  
    private Integer userId;
    // 用户名  
    private String userName;  
    // 用户密码  
    private String password;  
    // 用户生日  
    private Date birthday;
    // 用户钱包  
    private double money;

    // 需要包裹子标签
    @XmlElementWrapper(name = "persons")
    // 子标签单个对象使用的item包裹,如果不配的话
    // 将使用person来包括每一个对象
    @XmlElement(name = "item")
    private List<Person> person;
  
    public User() {  
        super();  
    }  
  
    public User(int userId, String userName, String password, Date birthday,  
            double money) {  
        super();  
        this.userId = userId;  
        this.userName = userName;  
        this.password = password;  
        this.birthday = birthday;  
        this.money = money;  
    }  
  
    public int getUserId() {  
        return userId;  
    }  
  
    public void setUserId(int userId) {  
        this.userId = userId;  
    }  
  
    public String getUserName() {  
        return userName;  
    }  
  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
  
    public void setPassword(String password) {  
        this.password = password;  
    }  
  
    public Date getBirthday() {  
        return birthday;  
    }  
  
    public void setBirthday(Date birthday) {  
        this.birthday = birthday;  
    }  
  
    public double getMoney() {  
        return money;  
    }  
  
    public void setMoney(double money) {  
        this.money = money;  
    }

    public List<Person> getPerson() {
        return person;
    }

    public void setPerson(List<Person> person) {
        this.person = person;
    }

    @Override
    public String toString() {  
        return "User [birthday=" + birthday + ", money=" + money  
                + ", password=" + password + ", userId=" + userId  
                + ", userName=" + userName + "]";  
    }  
  
} 

顶层对象的子对象:

package jol;

public class Person {

    public Person() {
    }
    private String name;
    private String age;

    public Person(String name) {
        this.name = name;
    }
    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

测试类:

package jol;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class TestText {

    public static void main(String[] args) {
        // 需要格式化的类
        User user = new User();
        user.setBirthday(new Date());
        user.setMoney(19.0D);
        user.setPassword("jeffchan");
        List<Person> peoples = Arrays.asList(
                new Person("jeff.chan", "123"),
                new Person("jeff.chan1", "1234"));
        user.setPerson(peoples);
        System.out.println(TextUtils.convertToXml(user));
    }
}

测试输出结果:

<root>
    <password>jeffchan</password>
    <birthday>2020-12-23T19:49:42.043+08:00</birthday>
    <money>19.0</money>
    <persons>
        <person>
            <age>123</age>
            <name>jeff.chan</name>
        </person>
        <person>
            <age>1234</age>
            <name>jeff.chan1</name>
        </person>
    </persons>
</root>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值