1.  先贴一下我们要实现的xml格式:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<CONDITIONS>
    <CONTITION exp="12" no="1" sid="12">
        <bdmbkbh>2</bdmbkbh>
        <fhjgjls>2</fhjgjls>
        <rxxsd operation="!=">80</rxxsd>
        <sjgliat>
            <operation>=</operation>
            <value>30</value>
        </sjgliat>
        <sjgliat>
            <operation>1=</operation>
            <value>20</value>
        </sjgliat>
    </CONTITION>
</CONDITIONS>

 

2. xml转对象,和对象转xml方法:

/**
     * @param xmlStr 字符串
     * @param c      对象Class类型
     * @return 对象实例
     */
    @SuppressWarnings("unchecked")
    public static <T> T xml2Object(String xmlStr, Class<T> c) {
        try {
            JAXBContext context = JAXBContext.newInstance(c);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            T t = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
            return t;
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @param object 对象
     * @return 返回xmlStr
     */
    public static String object2Xml(Object object) {
    //这个地方传的是一个对象
        try {
            StringWriter writer = new StringWriter();
            JAXBContext context = JAXBContext.newInstance(object.getClass());
            Marshaller marshal = context.createMarshaller();
            marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化输出
            marshal.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式,默认为utf-8
            marshal.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml头信息
            marshal.setProperty("jaxb.encoding", "utf-8");
            marshal.marshal(object, writer);
            return new String(writer.getBuffer());

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

 

3. 常用的注解:

@XmlAttribute(name = " ")

这个是 < 后面的值 ,例如:

<CONTITION exp="1*2" no="1" result="" sid="0012">
这个 exp no result 都是在实体类的get方法上 加上了这个注解 , name 后面是随意起的,不用和实体类的属性对应
@XmlValue
这个是用于这种情况<RXXSD operation="=">30</RXXSD>

我们把 RXSSD 当成一个对象,里面有两个属性值 operation 和 value,
在value的get方法上加上@XmlValue 注解,就不会显示 value=30 而是只显示 30
@XmlElement(name = "CONTITION") 
这个注解用不用都一样,因为默认的会将对象名做为一个节点例如 
<user>
</user>
但是也可以加上这个注解,这样可以将这个对象起任意的节点名字。

@XmlRootElement( name = "CONDITIONS" ) 
这个意思是标记这个实体类在最外层根节点
@XmlElements({ @XmlElement(name = "CSRQ", type = CSRQ.class) }) 
这个一般用不着,当出问题了,报找不到实体类路径的问题时候,就这样写

给对象赋值,然后用上面的方法:

object2Xml(Object)

 详细代码如下:

实体类:

package demon;

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

/**
 * Created by mabin6 on 2018/8/31.
 */
@XmlRootElement( name = "CONDITIONS" )
public class conditions {
 List<condition> conlist = new ArrayList<>();
    @XmlElement(name = "CONTITION")
    public List<condition> getConlist() {
        return conlist;
    }

    public void setConlist(List<condition> conlist) {
        this.conlist = conlist;
    }
}
package demon;

import javax.xml.bind.annotation.XmlAttribute;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by mabin6 on 2018/8/31.
 */
public class condition {
    private String exp;
    private String no;
    private String sid;
    private String bdmbkbh;
    private String fhjgjls;
    private rxxsd rxxsd;
    private List<sjgsdw> sjgliat = new ArrayList<>();
    @XmlAttribute(name = "exp")
    public String getExp() {
        return exp;
    }

    public void setExp(String exp) {
        this.exp = exp;
    }
    @XmlAttribute(name = "no")
    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }
    @XmlAttribute(name = "sid")
    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getBdmbkbh() {
        return bdmbkbh;
    }

    public void setBdmbkbh(String bdmbkbh) {
        this.bdmbkbh = bdmbkbh;
    }

    public String getFhjgjls() {
        return fhjgjls;
    }

    public void setFhjgjls(String fhjgjls) {
        this.fhjgjls = fhjgjls;
    }

    public List<sjgsdw> getSjgliat() {
        return sjgliat;
    }

    public void setSjgliat(List<sjgsdw> sjgliat) {
        this.sjgliat = sjgliat;
    }

    public demon.rxxsd getRxxsd() {
        return rxxsd;
    }

    public void setRxxsd(demon.rxxsd rxxsd) {
        this.rxxsd = rxxsd;
    }
}

package demon;

/**
 * Created by mabin6 on 2018/8/31.
 */
public class sjgsdw {
    private String operation;
    private String value;

    public String getOperation() {
        return operation;
    }

    public void setOperation(String operation) {
        this.operation = operation;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
package demon;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;

/**
 * Created by mabin6 on 2018/8/31.
 */
public class rxxsd {
    private String operation;
    private String value;

    @XmlAttribute(name = "operation")
    public String getOperation() {
        return operation;
    }

    public void setOperation(String operation) {
        this.operation = operation;
    }
    @XmlValue
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

主函数:

package demon;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by mabin6 on 2018/8/31.
 */
public class testMain {

    public static  void main(String[] args){
        conditions conds = new conditions();

        condition cdon = new condition();

        List<condition> conlist = new ArrayList<>();
        cdon.setBdmbkbh("2");
        cdon.setExp("12");
        cdon.setFhjgjls("2");
        cdon.setNo("1");
        cdon.setSid("12");

        List<sjgsdw> sjgliat = new ArrayList<>();
        sjgsdw sjdw1 = new sjgsdw();
        sjdw1.setOperation("=");
        sjdw1.setValue("30");
        sjgliat.add(sjdw1);
        sjgsdw sjdw2 = new sjgsdw();
        sjdw2.setOperation("1=");
        sjdw2.setValue("20");
        sjgliat.add(sjdw2);
        cdon.setSjgliat(sjgliat);

        rxxsd rxsd = new rxxsd();
        rxsd.setValue("80");
        rxsd.setOperation(">");

        cdon.setSjgliat(sjgliat);
        cdon.setRxxsd(rxsd);

        conlist.add(cdon);
        conds.setConlist(conlist);

         System.out.println(object2Xml(conds));



    }
    /**
     * @param xmlStr 字符串
     * @param c      对象Class类型
     * @return 对象实例
     */
    @SuppressWarnings("unchecked")
    public static <T> T xml2Object(String xmlStr, Class<T> c) {
        try {
            JAXBContext context = JAXBContext.newInstance(c);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            T t = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
            return t;
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @param object 对象
     * @return 返回xmlStr
     */
    public static String object2Xml(Object object) {
        //这个地方传的是一个对象
        try {
            StringWriter writer = new StringWriter();
            JAXBContext context = JAXBContext.newInstance(object.getClass());
            Marshaller marshal = context.createMarshaller();
            marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化输出
            marshal.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式,默认为utf-8
            marshal.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml头信息
            marshal.setProperty("jaxb.encoding", "utf-8");
            marshal.marshal(object, writer);
            return new String(writer.getBuffer());

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
}

最后运行结果:

?xml version="1.0" encoding="utf-8" standalone="yes"?>
<CONDITIONS>
    <CONTITION exp="12" no="1" sid="12">
        <bdmbkbh>2</bdmbkbh>
        <fhjgjls>2</fhjgjls>
        <rxxsd operation=">">80</rxxsd>
        <sjgliat>
            <operation>=</operation>
            <value>30</value>
        </sjgliat>
        <sjgliat>
            <operation>1=</operation>
            <value>20</value>
        </sjgliat>
    </CONTITION>
</CONDITIONS>