`
huiqinbo
  • 浏览: 335079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAXB2完成java bean到xml的相互转换【转】

 
阅读更多

JAXB2完成java bean到xml的相互转换

Posted on 2011-06-03 12:04 landor 阅读(284) 评论(0)  编辑  收藏 所属分类: XML <!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.blogjava.net/landor2004/archive/2011/06/03/351656.html" dc:identifier="http://www.blogjava.net/landor2004/archive/2011/06/03/351656.html" dc:title="JAXB2完成java bean到xml的相互转换" trackback:ping="http://www.blogjava.net/landor2004/services/trackbacks/351656.aspx" /> </rdf:RDF> -->
JAXB功能非常强大,主要是对java bean到xml之间的互转;JAXB的doc比较全面,网址:
http://jaxb.java.net/tutorial/
jdk5+已经自带了jaxb的包;应该是在rt.jar里;用法也比较简单,步骤如下:
1 加入@XmlRootElement注解,标识xml根节点,默认名字是类名,可以加入name属性来改名;
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@XmlRootElement
public class User{
    
private String userId;
    
private String userName;
    
public String getUserId(){};
    
public String getUserName(){};
2 加入@XmlElement注解,生成xml中的子节点,其实可以不加,不加默认就是生成,可以指定name修改节点名
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    private String userId;
    private String userName;
     @XmlElement
    public String getUserId(){};
    
public String getUserName(){};
3 现在就可以生成xml了,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class TestJAXB {
    @Test
    
public void bean2XML() throws Exception{
        User user 
= new User();
        user.setUserId(
"id1");
        user.setUserName(
"aaa");
        JAXBContext context 
= JAXBContext.newInstance(user.getClass());
        Marshaller m 
= context.createMarshaller();
        StringWriter sw 
= new StringWriter();
        m.marshal(user,sw);
        System.out.println(sw.toString());
    }
}
4 生成了xml文件,可以转换成bean,比如:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class TestJAXB {
    @Test
    
public void xml2Bean() throws Exception{
        User user 
= new User();
        String xml 
= "xml字符串";
        JAXBContext context 
= JAXBContext.newInstance(user.getClass());
        Unmarshaller um 
=context.createUnmarshaller();
        StringReader sr 
= new StringReader(xml);
        user 
= (User)um.unmarshal(sr);
        
        System.out.println(user.getUserId());
    }
}

简单转化就做完了,有几个地方:
1 生成xml比较简单,如果想把User里的userId和name变成xml根节点的一个属性可用(如果有get方法,需要加到get方法上)
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    @XmlAttribute
    
String userId;
    @XmlAttribute
   
String userName;
生成的xml类似:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><user userId="id1" userName="aaa">
    
<!--其他元素内容-->
</user>

2 如果想在节点外面包裹一层,可以用
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    @XmlElementWrapper(name="wapper" )
    @XmlAttribute
    
private String userName;
生成的xml类似:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><user>
    
<userId>id1</userId>
    
<wapper>
        
<userName>aaa</userName>
    
</wapper>
    
<!--其他元素内容-->
</user>
3 关于多态,JAXB也是支持的:有两种方式
    A 通过@XmlSeeAlso,比如:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@XmlRootElement
public class User{
    Person person;
}

@XmlSeeAlso({Man.
class, Girl.class})
public class Person{
}

public class Man extends Person{
}

public class Girl extends Person{
}

  B 用SeeAlso注解的缺点是:每次加一个子类都需要修改注解代码重新编译,其实可以直接在JAXBContext.newInstance()中加入这些子类:比如
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->JAXBContext context = JAXBContext.newInstance(user.getClass(), Man.class, Girl.class);

以上两种方式都可以把xml  Unmarshaller 成java bean;根据情况任选其一。

分享到:
评论

相关推荐

    利用JAXB进行xml和javabean之间转换

    NULL 博文链接:https://luyuwww.iteye.com/blog/1988355

    java 使用 JAXB 将xml转换为 bean 包含xml和dto和读取文件的util类

    java 使用 JAXB 将xml转换为 bean 包含xml和dto和读取文件的util类

    xml转javaBean,javaBean转xml,xml标签大小写问题,以及对xml特殊符号的处理

    xml转javaBean,javaBean转xml,xml标签大小写问题,CDATA的生成,以及对xml特殊符号的处理

    spring O/X 映射

    例如,您可能有一个带有几个属性的简单 bean,且您的业务需要将那个 Java 对象转换为一个 XML 文档。Spring 的 O/X Mapper 能够为您解决那个问题。如果反过来,您需要将一个 XML 文档转换为一个简单 Java bean,...

    JAVA_API1.6文档(中文)

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    jaxme-0.3.jar.zip

    l JaxMe是JAXB(Java/XML绑定规范)的开源实现 l Java/XML绑定编译器的输入是模式描述:大多数是XML模式,也可以是DTD、RelaxNG模式、通过反射的JavaBean或数据库模式 l 输出是一系列Java类: Ø 兼容模式描述的...

    Java 1.6 API 中文 New

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    jackson-jar

    用于json和Java Bean的相互转换。 下面从使用的角度上比较三种处理方式: Streaming API 执行效率最高,读写速度最快,另外两种方式都基于它实现; Tree Model 是最灵活的; Data Binding 通常是最方便使用...

    JavaAPI中文chm文档 part2

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    java api最新7.0

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    JavaAPI1.6中文chm文档 part1

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    从Java走向Java+EE+.rar

    4.6 Java EE中的JAXB 55 4.7 小结 64 第5章 使用Java Servlet开发动态网页 65 5.1 Servlet的概念和生命周期 65 5.2 如何编写Servlet 67 5.3 使用Eclipse和Tomcat开发Servlet实例——输出字符串响应 72 ...

    [Java参考文档]

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    [Java参考文档].JDK_API 1.6

    javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 ...

    JDK_1_6 API

    javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 ...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

Global site tag (gtag.js) - Google Analytics