marshaller unmarshaller解析xml和读取xml

摘要:
另一方面,JAXB提供了一种将XML模式绑定到Java表示的快速简便的方法,这样Java开发人员就可以在Java应用程序中轻松地组合XML数据和处理功能。介绍下的相关课程。SmsDeliverReq是一个请求对象。类中有两个属性,即ReqHeaderreqHeader和ListsmsBodies。ReqHeader和SmsBody是自定义类型。我们现在需要做的是将SmsDeliverReq的实例转换为xml,并将xml转换为SmsDeliversReq的示例。测验java封装了两种方法:xml-˃javabean和javabean-˃xml。

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
好了,废话少说,看看简单的例子。

介绍下相关的类。SmsDeliverReq是一个请求对象,类中有两个属性,分别为ReqHeader reqHeader和List<SmsBody> smsBodys。ReqHeader和SmsBody都为自定义类型。这两个类中的属性都为基本数据类型。

现在需要做的是将SmsDeliverReq的实例转换为xml和将xml转换为SmsDeliverReq实例,Test.java中封装了xml->javabean 和 javabean->xml的两个方法。并且实现了将生成的xml格式的字符串保存到xml文件中 

ReqHeader.java

package cn.mr.javabeanxml;

import javax.xml.bind.annotation.XmlElement;

/**
 * 请求头对象
 * @author xuejiangtao
 * Jul 25, 2013 9:33:57 PM
 */
public class ReqHeader {
    
    /**
     * 系统编号
     */
    private String sysId;
    
    /**
     * 鉴权码
     */
    private String authCode;
    
    /**
     * 流水号
     */
    private String reqNo;

    public String getSysId() {
        return sysId;
    }

    @XmlElement(name="SYSID")
    public void setSysId(String sysId) {
        this.sysId = sysId;
    }

    public String getAuthCode() {
        return authCode;
    }

    @XmlElement(name="AUTHCODE")
    public void setAuthCode(String authCode) {
        this.authCode = authCode;
    }

    public String getReqNo() {
        return reqNo;
    }

    @XmlElement(name="REQNO")
    public void setReqNo(String reqNo) {
        this.reqNo = reqNo;
    }
    
    

}

SmsBody.java

package cn.mr.javabeanxml;

import javax.xml.bind.annotation.XmlElement;

/**
 * 请求内容
 * @author xuejiangtao
 * Jul 25, 2013 9:34:16 PM
 */
public class SmsBody {
    
    /**
     * 短信内容
     */
    private String content;
    
    /**
     * 手机号
     */
    private String sourceAddr;
    
    /**
     * 服务代码
     */
    private String destAddr;

    public String getContent() {
        return content;
    }

    @XmlElement(name="CONTENT")
    public void setContent(String content) {
        this.content = content;
    }

    public String getSourceAddr() {
        return sourceAddr;
    }

    @XmlElement(name="SOURCEADDR")
    public void setSourceAddr(String sourceAddr) {
        this.sourceAddr = sourceAddr;
    }

    public String getDestAddr() {
        return destAddr;
    }

    @XmlElement(name="DESTADDR")
    public void setDestAddr(String destAddr) {
        this.destAddr = destAddr;
    }
    
    

}

SmsDeliverReq.java

package cn.mr.javabeanxml;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * 请求对象
 * @author xuejiangtao
 * Jul 25, 2013 9:34:26 PM
 */
@XmlRootElement(name="SMSDELIVERREQ")
public class SmsDeliverReq {
    
    private ReqHeader reqHeader;
    
    private List<SmsBody> smsBodys;

    @XmlElement(name="REQHEADER")
    public ReqHeader getReqHeader() {
        return reqHeader;
    }

    public void setReqHeader(ReqHeader reqHeader) {
        this.reqHeader = reqHeader;
    }

    @XmlElementWrapper(name="SMSBODYS")
    @XmlElement(name="SMSBODY")
    public List<SmsBody> getSmsBodys() {
        return smsBodys;
    }

    public void setSmsBodys(List<SmsBody> smsBodys) {
        this.smsBodys = smsBodys;
    }
}

Test.java

package cn.mr.javabeanxml;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import cn.mr.javabeanxml.ReqHeader;
import cn.mr.javabeanxml.SmsBody;
import cn.mr.javabeanxml.SmsDeliverReq;

public class Test {
    
    /**
     * XML转换为javabean
     * Jul 25, 2013 9:39:05 PM xuejiangtao添加此方法
     * @param <T>
     * @param xml
     * @param t
     * @return
     * @throws JAXBException
     */
    public static <T> T xmlToBean(String xml, T t) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        Unmarshaller um = context.createUnmarshaller();
        StringReader sr = new StringReader(xml);
        t = (T) um.unmarshal(sr);
        return t;
    }
    
    /**
     * javabean转换为XML
     * Jul 25, 2013 9:39:09 PM xuejiangtao添加此方法
     * @param smsDeliverReq
     * @return
     * @throws JAXBException
     * @throws FileNotFoundException 
     */
    public static <T> StringWriter beanToXml(T t) throws JAXBException, FileNotFoundException {
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        Marshaller m = context.createMarshaller();
        StringWriter sw = new StringWriter();
        m.marshal(t, sw);
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);//是否格式化
        m.marshal(t, new FileOutputStream("src/cn/mr/javabeanxml/test.xml"));
        return sw;
    }

    /**
     * Jul 24, 2013 10:12:39 PM xuejiangtao添加此方法
     * @param args
     * @throws JAXBException 
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws JAXBException, FileNotFoundException {
        ReqHeader reqHeader = new ReqHeader();
        reqHeader.setReqNo("111");
        reqHeader.setAuthCode("DDDD");
        reqHeader.setSysId("jjj");
        
        SmsBody smsBody = new SmsBody();
        smsBody.setContent("类容讷讷");
        smsBody.setDestAddr("1589594");
        smsBody.setSourceAddr("9999");
        
        SmsBody smsBody1 = new SmsBody();
        smsBody1.setContent("asdf");
        smsBody1.setDestAddr("asdf");
        smsBody1.setSourceAddr("4fdf");

        
        SmsDeliverReq smsDeliverReq = new SmsDeliverReq();
        smsDeliverReq.setReqHeader(reqHeader);
        List<SmsBody> smsBodys = new ArrayList<SmsBody>();
        smsBodys.add(smsBody);
        smsBodys.add(smsBody1);
        smsDeliverReq.setSmsBodys(smsBodys);
        
        StringWriter sw = beanToXml(smsDeliverReq);
        System.out.println(sw.toString());
        
        SmsDeliverReq xmlToBean = xmlToBean(sw.toString(), smsDeliverReq);
        System.out.println(xmlToBean.toString());
    }
}

一下内容来自百度百科,个人觉得非常重要。
JDK中JAXB相关的重要Class和Interface:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。

JDK中JAXB相关的重要Annotation:
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
其他:
对于要序列化(marshal)为XML的Java类,绝不能把成员变量声明为public,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。
对于JAXB相关的重要Annotation的声明,如@Xml.....,可以放在成员变量的setter()或getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。 

免责声明:文章转载自《marshaller unmarshaller解析xml和读取xml》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Webservice接口和Http接口导航守卫下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# automapper 使用(一)

一、最简单的用法 有两个类User和UserDto 1 public class User 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 public int Age { get;...

C# 解析带多个命名空间的xml文件

C#中用SelectSingleNode方法解析带有多个命名空间的XML文件XML文件如下: <?xml version="1.0" encoding="utf-8" ?><Enginuity:ViewControlxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentat...

kie-api介绍和使用

参考:KIE kie在drools jbpm uberfire里广泛被使用,下面对kie-api中的几个重要组件做下简单介绍 maven依赖 <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId>...

C# 基本数据类型

Ø  前言 每个编程语言都有基本的数据类型,例如 C、C++、Java、Python、PHP、JavaScript、以及各种数据库等,而 C# 也不例外。本篇主要讨论 C# 中的一些常用的基础数据类型。   1.   值类型 Ø  值类型隐式继承于 System.ValueType,而 System.ValueType 隐式继承于 System.Objec...

XML外部实体(XXE)

A4-XML外部实体(XXE) 如果攻击者可以上传XML文档或者在XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,他们就能够攻击含有缺陷的XML处理器。 XXE影响-XXE缺陷可用于提取数据、执行远程服务器请求、扫描内部系统、执行拒绝服务攻击和其他攻击。 XML 可扩展标记语言(Extensible Markup Language,XML...

HBuilder ,及自用主题

字体:Consolas http://bbs.csdn.net/topics/390858585   让代码更美:你最爱的编程字体 http://www.dcloud.io     HBuilder下载 http://ask.dcloud.net.cn/docs  文档 http://www.dcloud.io/readme/#title12    nat...