xml 转 对象 对象转xml

Posted 煎蛋的技术笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml 转 对象 对象转xml相关的知识,希望对你有一定的参考价值。


今天在和外部对接接口时,需要用到 xml 格式的请求参数。刚下手时突然感觉有点手生,这次特地记录一下。

直接上互转代码


```

import com.alibaba.fastjson.JSON;


import javax.xml.bind.JAXBContext;

import javax.xml.bind.JAXBException;

import javax.xml.bind.Marshaller;

import javax.xml.bind.Unmarshaller;

import java.io.IOException;

import java.io.StringReader;

import java.io.StringWriter;


public class XmlParseUtils {

/**

* bean转化成xml 

* @param obj

* @param load

* @return

* @throws JAXBException

*/

public static String beanToXml(Object obj, Class<?> load)  {

JAXBContext context;

try {

context = JAXBContext.newInstance(load);

Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 是否格式化生成的xml串

marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //编码格式

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xm头声明信息

StringWriter writer = new StringWriter();

marshaller.marshal(obj, writer);

return writer.toString();

} catch (JAXBException e) {

e.printStackTrace();

throw new IllegalArgumentException("xmlContext:"+ JSON.toJSONString(obj) +",class:"+load.getName(),e);

}

}


/**

* xml转化成bean

* @param load

* @return

* @throws JAXBException

* @throws IOException

*/

public static <T> T xmlToBean(String xmlContext, Class<T> load) {

try {

JAXBContext context = JAXBContext.newInstance(load);

Unmarshaller unmarshaller = context.createUnmarshaller();

StringReader sr = new StringReader(xmlContext);

Object  object = unmarshaller.unmarshal(sr);

return (T) object;

} catch (JAXBException e) {

throw new IllegalArgumentException("xmlContext:"+xmlContext +",class:"+load.getName(),e);

}

}

}

```



转化的代码还是很简单的。但接下来问题来了,对面要求,对象的首字母大写其余的小写,参数的字母都要大写。可这明显不符合命名规范。于是只能强行命名。

这是便要用到xml的注解了。

如下面的对象


```

import javax.xml.bind.annotation.XmlAttribute;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement(name = "Person")

public class Person {

    private String name;

    private String style;


    private Family family;


    @XmlAttribute(name = "NAME")

    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }

    @XmlAttribute(name = "STYLE")

    public String getStyle() {

        return style;

    }


    public void setStyle(String style) {

        this.style = style;

    }


    @XmlElement(name = "Family")

    public Family getFamily() {

        return family;

    }


    public void setFamily(Family family) {

        this.family = family;

    }

}

```


下面分别来讲一下这些注解的作用

@XmlRootElement(name = *”Person”*),这个是*必须要的注解*,里面的name 是为了解决刚提到的xml的首字母大写的问题。

@XmlAttribute(name = *”NAME”*),是用来解决字段显示在同一个</>中的问题,name是为了解决刚提到的字段字母大写的问题。也可以使用@ XmlElement(name = *”NAME”*),但两个注解的显示方式不一样。如使用@XmlAttribute 显示<Person NAME=“张珊” />    如使用XmlElement(name = *”NAME”*) 显示 <Person><NAME>张珊</NAME></Person> 

@XmlElement(name = *”Family”*), 是用来解决对象的xml的首字母大写的问题。



到此,对方的要求全部满足


如刚入门,建议看一下w3cschool [JAXB 概述_w3cschool](https://www.w3cschool.cn/jaxb2/jaxb2-5hnk2zo8.html)



以上是关于xml 转 对象 对象转xml的主要内容,如果未能解决你的问题,请参考以下文章

Java对象转xml报文和xml报文转Java对象帮助类

xml字符串转对象xml文件转对象

PHP XML转数组,对象转数组

xml转Map,对象,Map转xml的工具类方法

转Android中 layoyt.xml转view对象

[PHP] xml转对象函数simplexml_load_string