Jaxb 学习

网上找了很多jaxb 的资料自己留下印记,以免以后还得再找:

例子来源:

http://www.2cto.com/kf/201312/264168.html

http://terrencexu.iteye.com/blog/702089

http://blog.itpub.net/21147177/viewspace-604364/

还有一些找不到了 这几个应该够看懂了

还有俩个在线xml校验网站

http://www.bejson.com/go.php?u=http://www.bejson.com/xml2json/

http://www.freeformatter.com/xsd-generator.html#ad-output

当然以后不知道会不会 没有了

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

Xml和javabean之间的互相转换是开发中常常遇到的问题,今天小试了一下JAXB,感觉真是太方便了,这里特此记录(JDK6中加入了JAXB,不需要额外导出包)

利用JAXB实现XML与Javabean之间的相互转换的大致思想:利用XML的生成相应的XSD或者DTD,然后利用该XSD或DTD生成对应的javabeanClass和ObjectFactory, 网上找个一个来描述了这个步骤:

一些名词:

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。

DTD (Documnet Type Definition) 即文档类型定义,是一套关于标记符的语法规则。它是XML1.0版规格得一部分,是XML文件的验证机制,属于XML文件组成的一部分。

XSD(XML Schema Definition,XSD) XML Schema 定义, 是基于 XML 的 DTD 替代者

开始转换

一. 利用XML生成相应XSD或者DTD

1. 生成XSD可以通过一个online工具完成.

网址: http://www.freeformatter.com/xsd-generator.html#ad-output


加载中...
2. 生成DTD,通过一个java小工具:http://sourceforge.net/projects/xml2dtd/


加载中...

二. 利用生成的XSD或者DTD生成java类:

1. 命令行的方式(jdk6的支持)

(a) XSD生成java: cmd--> cd xsd所在文件夹--> xjc –d . –p 包名 ./test.xsd

(b) DTD生成java: cmd --> cd DTD所在文件夹 --> xjc -dtd –d . –p 包名 ./test.dtd

2. Eclipse下面生成java类,此方法只针对xsd,选中你的xsd,右键:


加载中...
然后选择包等操作,一步一步就可以生成了.

注意:XML里面最好不要包含value等敏感关键字,如果包含.先用别的名词替换,当生成javabean后再修改javabean.

三. 利用生成javabean来进行xml和java之间的转换

a> XML到javabean

Java代码  加载中...
  1. File file = new File("C:/ML_OA_DATA.xml"); String xmlStr = FileUtils.readFileToString(file , "UTF-8"); Reader reader = new StringReader(xmlStr); Unmarshaller unmarshaller = JAXBContext.newInstance(Result.class).createUnmarshaller(); Result result = (Result) unmarshaller.unmarshal(reader); List list = result.getDocInfo().getField(); ListeFileList = result.getAttachments().getAttachment(); for (Attachment efile : eFileList) { System.out.println(efile.getFtpdir()); } 
    核心的就是这2句,1 注册对象,2反序列化 Unmarshaller unmarshaller = JAXBContext.newInstance(Result.class).createUnmarshaller(); Result result = (Result) unmarshaller.unmarshal(reader); unmarshal可以接收inputstream , read , file等.这里是通过string转换成reader b> javabean到XML Java代码  加载中...
    1. Marshaller mashaller = JAXBContext.newInstance(Result.class).createMarshaller(); ObjectFactory factory = new ObjectFactory(); Result toxmlResult = factory.createResult(); //可选 开始 Field theField = factory.createResultDocInfoField(); theField.setColName("ssss"); DocInfo dii = factory.createResultDocInfo(); dii.getField().add(theField); toxmlResult.setDocInfo(dii); //可选 结束 mashaller.marshal(toxmlResult, new File("c:/outPut.xml"));

      核心: 注册对象 和序列化

      Marshaller mashaller = JAXBContext.newInstance(Result.class).createMarshaller();

      mashaller.marshal(toxmlResult, new File("c:/outPut.xml"));

      上面是第一个简单的列子

      在java开发中使用XML几乎是每个程序员都会碰到的,目前可供我们选择的库也有很多,包括,dom4j, jaxen,  SAX等等,本文将介绍如何使用JAXB进行Object-XML mapping.

       

      JAXB目前已经集成到了JDK6中,但是还是推荐下载使用最新版的jaxb库, https://jaxb.dev.java.net/

       

      从JAXB2.0开始,可以通过使用annotation进行Object-XMl mapping。

       

      本文将通过以下步骤演示如何使用JAXB annotation绑定使用了namespace的XML文件

      1. 创建employees.xml文件

      2. 创建Employees.java和Employee.java绑定employees.xml

      3. 创建package-info.java和jaxb.index文件

      4. 创建XMLParser.java封装marshal/unmarshal操作

      5. 创建Test.java运行测试

       

      现在将逐步展开演示

      1. 创建employees.xml文件

      Xml代码   收藏代码
      1. <?xml version="1.0" encoding="utf-8" ?>  
      2. <employees xmlns:admin="http://www.company.com/management/employees/admin">  
      3.     <admin:employee>  
      4.         <admin:userId>johnsmith@company.com</admin:userId>  
      5.         <admin:password>abc123_</admin:password>  
      6.         <admin:name>John Smith</admin:name>  
      7.         <admin:age>24</admin:age>  
      8.         <admin:gender>Male</admin:gender>  
      9.     </admin:employee>  
      10.     <admin:employee>  
      11.         <admin:userId>christinechen@company.com</admin:userId>  
      12.         <admin:password>123456</admin:password>  
      13.         <admin:name>Christine Chen</admin:name>  
      14.         <admin:age>27</admin:age>  
      15.         <admin:gender>Female</admin:gender>  
      16.     </admin:employee>  
      17. </employees>  

       这是一个很普通的xml文件,用于展示组织内部的成员(employee)状况,这里有一点需要注意的是使用了namespace,这也是本文将要演示的重点。

       

      2. 创建Employees.java和Employee.java绑定employees.xml

       

      Java代码   收藏代码
      1. package com.javaeye.terrencexu.jaxb;  
      2.   
      3. import java.util.ArrayList;  
      4. import java.util.List;  
      5.   
      6. import javax.xml.bind.annotation.XmlElement;  
      7. import javax.xml.bind.annotation.XmlRootElement;  
      8.   
      9. @XmlRootElement(name = "employees")  
      10. public class Employees {  
      11.   
      12.     @XmlElement(name = "employee", namespace=NameSpace.ADMIN_URI)  
      13.     private List<Employee> employees;  
      14.   
      15.     public Employees() {  
      16.         employees = new ArrayList<Employee>();  
      17.     }  
      18.   
      19.     public List<Employee> getEmployees() {  
      20.         return employees;  
      21.     }  
      22.       
      23.     public void addEmployee(Employee employee) {  
      24.         employees.add(employee);  
      25.     }  
      26.   
      27. }  

       

       

      Java代码   收藏代码
      1. package com.javaeye.terrencexu.jaxb;  
      2.   
      3. import javax.xml.bind.annotation.XmlElement;  
      4.   
      5. public class Employee {  
      6.   
      7.     @XmlElement(name = "userId", namespace=NameSpace.ADMIN_URI)  
      8.     private String userId;  
      9.   
      10.     @XmlElement(name = "password", namespace=NameSpace.ADMIN_URI)  
      11.     private String password;  
      12.   
      13.     @XmlElement(name = "name", namespace=NameSpace.ADMIN_URI)  
      14.     private String name;  
      15.   
      16.     @XmlElement(name = "age", namespace=NameSpace.ADMIN_URI)  
      17.     private int age;  
      18.   
      19.     @XmlElement(name = "gender", namespace=NameSpace.ADMIN_URI)  
      20.     private String gender;  
      21.   
      22.     public Employee() {  
      23.     }  
      24.   
      25.     public Employee(String userId, String psw, String name, int age, Gender gender) {  
      26.         this.userId = userId;  
      27.         this.password = psw;  
      28.         this.name = name;  
      29.         this.age = age;  
      30.         this.gender = gender.getValue();  
      31.     }  
      32.   
      33.     public String getUserId() {  
      34.         return userId;  
      35.     }  
      36.   
      37.     public String getPassword() {  
      38.         return password;  
      39.     }  
      40.   
      41.     public String getName() {  
      42.         return name;  
      43.     }  
      44.   
      45.     public int getAge() {  
      46.         return age;  
      47.     }  
      48.   
      49.     public String getGender() {  
      50.         return gender;  
      51.     }  
      52.   
      53. }  

       

       

      Java代码   收藏代码
      1. package com.javaeye.terrencexu.jaxb;  
      2.   
      3. public class NameSpace {  
      4.   
      5.     public static final String ADMIN_PREFIX = "admin";  
      6.     public static final String ADMIN_URI = "http://www.company.com/management/employees/admin";  
      7.   
      8. }  

       

      Java代码   收藏代码
      1. package com.javaeye.terrencexu.jaxb;  
      2.   
      3. public enum Gender {  
      4.   
      5.     MALE("Male"),  
      6.     FEMALE("Female");  
      7.       
      8.     private String value;  
      9.       
      10.     private Gender(String value) {  
      11.         this.value = value;  
      12.     }  
      13.       
      14.     public String getValue() {  
      15.         return this.value;  
      16.     }  
      17.       
      18. }  

       

      3. 创建package-info.java和jaxb.index文件

      创建package-info.java注册xmlns, 将该文件放在当前source code的package下面,如果不使用namespace可以不创建该文件

      Java代码   收藏代码
      1. @XmlSchema(  
      2. xmlns={  
      3.         @XmlNs(prefix=NameSpace.ADMIN_PREFIX, namespaceURI=NameSpace.ADMIN_URI)  
      4. }  
      5. )  
      6. package com.javaeye.terrencexu.jaxb;  
      7. import javax.xml.bind.annotation.XmlNs;  
      8. import javax.xml.bind.annotation.XmlSchema;  

       

      创建jaxb.index注册Employees, Employee,如果不使用包级context,可以不创建该文件

      Java代码   收藏代码
      1. Employees  
      2. Employee  

       

       

      4. 创建XMLParser.java封装marshal/unmarshal操作

       

      Java代码   收藏代码
      1. package com.javaeye.terrencexu.jaxb;  
      2.   
      3. import java.io.InputStream;  
      4. import java.io.StringWriter;  
      5.   
      6. import javax.xml.bind.JAXBContext;  
      7. import javax.xml.bind.JAXBException;  
      8. import javax.xml.bind.Marshaller;  
      9. import javax.xml.bind.Unmarshaller;  
      10.   
      11. public final class XMLParser {  
      12.   
      13.     private XMLParser() {}  
      14.       
      15.     public static Object unmarshal(InputStream xml, Class<?> clazz) {  
      16.         Object obj = null;  
      17.           
      18.         try {  
      19.             JAXBContext jc = JAXBContext.newInstance(clazz.getPackage().getName());  
      20.             Unmarshaller u = jc.createUnmarshaller();  
      21.             obj = u.unmarshal(xml);  
      22.         } catch (JAXBException e) {  
      23.             throw new RuntimeException("Can't unmarshal the XML file, error message: " + e.getMessage());  
      24.         }  
      25.           
      26.         return obj;  
      27.     }  
      28.       
      29.     public static String marshal(Object obj, Class<?> clazz) {  
      30.         String result = null;  
      31.           
      32.         try {  
      33.             JAXBContext jc = JAXBContext.newInstance(clazz.getPackage().getName());  
      34.             Marshaller m = jc.createMarshaller();  
      35.               
      36.             StringWriter writer = new StringWriter();  
      37.               
      38.             m.marshal(obj, writer);  
      39.               
      40.             result = writer.toString();  
      41.         } catch (JAXBException e) {  
      42.             throw new RuntimeException("Can't marshal the XML file, error message: " + e.getMessage());  
      43.         }  
      44.           
      45.           
      46.         return result;  
      47.     }  
      48.       
      49. }  

       

       

      5. 创建Test.java运行测试

       

      Java代码   收藏代码
      1. package com.javaeye.terrencexu.jaxb;  
      2.   
      3. import java.io.File;  
      4. import java.io.FileInputStream;  
      5. import java.io.FileNotFoundException;  
      6. import java.util.List;  
      7.   
      8. public class Test {  
      9.   
      10.     public static void main(String[] args) throws FileNotFoundException {  
      11.         testUnmarshal();  
      12.         testMarshal();  
      13.     }  
      14.   
      15.     public static void testUnmarshal() throws FileNotFoundException {  
      16.         Employees employees = (Employees) XMLParser.unmarshal(  
      17.           new FileInputStream(new File("F:\\workspace\\JavaStudy\\test\\employees.xml")),  
      18.           Employees.class);  
      19.   
      20.         List<Employee> employeeList = employees.getEmployees();  
      21.   
      22.         if (employeeList != null && employeeList.size() > 0) {  
      23.             for (Employee employee : employeeList) {  
      24.                 StringBuilder builder = new StringBuilder();  
      25.                 builder.append("[UserID: ").append(employee.getUserId()).append(", ")  
      26.                        .append("Password: ").append(employee.getPassword()).append(", ")  
      27.                        .append("Name: ").append(employee.getName()).append(", ")  
      28.                        .append("Age: ").append(employee.getAge()).append(", ")  
      29.                        .append("Gender").append(employee.getGender()).append("]");  
      30.   
      31.                 System.out.println(builder.toString());  
      32.             }  
      33.         }  
      34.     }  
      35.       
      36.     public static void testMarshal() {  
      37.         Employees employees = new Employees();  
      38.         employees.addEmployee(new Employee("johnsmith@company.com""abc123_""John Smith"24, Gender.MALE));  
      39.         employees.addEmployee(new Employee("christinechen@company.com""123456""Christine Chen"27, Gender.FEMALE));  
      40.           
      41.         String result = XMLParser.marshal(employees, Employees.class);  
      42.         System.out.println(result);  
      43.     }  
      44. }  

       

      6. 运行结果:

      Java代码   收藏代码
      1. [UserID: johnsmith@company.com, Password: abc123_, Name: John Smith, Age: 24, GenderMale]  
      2. [UserID: christinechen@company.com, Password: 123456, Name: Christine Chen, Age: 27, GenderFemale]  
      3. <?xml version="1.0" encoding="UTF-8" standalone="yes"?><employees xmlns:admin="http://www.company.com/management/employees/admin"><admin:employee><admin:userId>johnsmith@company.com</admin:userId><admin:password>abc123_</admin:password><admin:name>John Smith</admin:name><admin:age>24</admin:age><admin:gender>Male</admin:gender></admin:employee><admin:employee><admin:userId>christinechen@company.com</admin:userId><admin:password>123456</admin:password><admin:name>Christine Chen</admin:name><admin:age>27</admin:age><admin:gender>Female</admin:gender></admin:employee></employees>  
上面这个是涉及到 命名空间的但是他这个列子,跟我这个有点区别,所以有看了 下面这个例子

最近项目中用到了JAXB以及Websphere Business Events,偶然从一个Defect中发现了这个问题,记录一下。

JavaBean中既包含简单类型属性,也包含复杂类型属性,如下面的Sample Code;

@XmlRootElement(name = "SampleRootBean", namespace = http://www.test.com/samplerootbean )
public class SampleRootBean {
    ....
    @XmlElement(namespace = "http://www.test.com/samplerootbean")
    private String ID;//简单类型
    @XmlElement(namespace = "http://www.test.com/samplerootbean")
    private String Name;//简单类型
    @XmlElement(namespace = "http://www.test.com/samplerootbean")
    private SampeChildBean[] SampleChileBean;//复杂类型
其通过JAXB的Marshaller序列化出的XML如下所示:

<SampleRootBean xmlns="http://www.test.com/samplerootbean " xmlns:ns2=http://www.test.com/samplechildben   xmlns:ns3=http://www.ibm.com/xmlns/prod/websphere/j2ca/sap/sapidoccontrolrecord

其中的命名空间按照父到子的关系以此递增排列,如xmlns,xmlns:ns2,xmlns:ns3...

JaveBean中只包含复杂类型属性,如下面的Sample Code;

@XmlRootElement(name = "SampleRootBean", namespace = " http://www.test.com/samplerootbean")
public class SampRootBean{
    ...
    @XmlElement(namespace = "http://www.test.com/samplerootbean")
    private SampleChild1 C1;
    @XmlElement(namespace = "http://www.test.com/samplerootbean")
    private SampleChild2 C2;
这时起通过JAXB的Marshaller序列化出的XML如下所示:

<ns2:SampleRootBean xmlns="http://www.test.com/samplerootbean/c1 " xmlns:ns2="http://www.test.com/samplerootbean" xmlns:ns3="http://www.test.com/samplerootbean/c2 ">



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值