Jaxb 学习

前端之家收集整理的这篇文章主要介绍了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之间转换@H_301_29@

@H_301_29@

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代码@H_301_29@ @H_301_29@
    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); Listlist = 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代码
      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. <?@H_301_29@xml@H_301_29@version@H_301_29@="1.0"@H_301_29@encoding@H_301_29@="utf-8"@H_301_29@?>@H_301_29@@H_301_29@
      2. <@H_301_29@employees@H_301_29@xmlns:admin@H_301_29@="http://www.company.com/management/employees/admin"@H_301_29@>@H_301_29@@H_301_29@
      3. admin:employee@H_301_29@admin:userId@H_301_29@>@H_301_29@johnsmith@company.com</@H_301_29@admin:password@H_301_29@>@H_301_29@abc123_admin:name@H_301_29@>@H_301_29@JohnSmithadmin:age@H_301_29@>@H_301_29@24admin:gender@H_301_29@>@H_301_29@Male>@H_301_29@christinechen@company.com>@H_301_29@123456>@H_301_29@ChristineChen>@H_301_29@27>@H_301_29@Femaleemployees@H_301_29@>@H_301_29@@H_301_29@

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

      Java代码
        package@H_301_29@com.javaeye.terrencexu.jaxb;@H_301_29@
      1. @H_301_29@
      2. import@H_301_29@java.util.ArrayList;@H_301_29@
      3. import@H_301_29@java.util.List;@H_301_29@
      4. import@H_301_29@javax.xml.bind.annotation.XmlElement;@H_301_29@
      5. import@H_301_29@javax.xml.bind.annotation.XmlRootElement;@H_301_29@
      6. @XmlRootElement@H_301_29@(name="employees"@H_301_29@)@H_301_29@
      7. public@H_301_29@class@H_301_29@Employees{@H_301_29@
      8. @XmlElement@H_301_29@(name="employee"@H_301_29@,namespace=NameSpace.ADMIN_URI)@H_301_29@
      9. private@H_301_29@List<Employee>employees;@H_301_29@
      10. public@H_301_29@Employees(){@H_301_29@
      11. employees=new@H_301_29@ArrayList<Employee>();@H_301_29@
      12. }@H_301_29@
      13. public@H_301_29@List<Employee>getEmployees(){@H_301_29@
      14. return@H_301_29@employees;@H_301_29@
      15. void@H_301_29@addEmployee(Employeeemployee){@H_301_29@
      16. employees.add(employee);@H_301_29@
      17. }@H_301_29@
      @H_196_301@class@H_301_29@Employee{@H_301_29@
    1. @XmlElement@H_301_29@(name="userId"@H_301_29@,85); font-weight:bold">private@H_301_29@StringuserId;@H_301_29@
    2. @XmlElement@H_301_29@(name="password"@H_301_29@,85); font-weight:bold">private@H_301_29@Stringpassword;@H_301_29@
    3. @XmlElement@H_301_29@(name="name"@H_301_29@,85); font-weight:bold">private@H_301_29@Stringname;@H_301_29@
    4. @XmlElement@H_301_29@(name="age"@H_301_29@,85); font-weight:bold">private@H_301_29@int@H_301_29@age;@H_301_29@
    5. @XmlElement@H_301_29@(name="gender"@H_301_29@,85); font-weight:bold">private@H_301_29@Stringgender;@H_301_29@
    6. public@H_301_29@Employee(){@H_301_29@
    7. public@H_301_29@Employee(StringuserId,Stringpsw,Stringname,int@H_301_29@age,Gendergender){@H_301_29@
    8. this@H_301_29@.userId=userId;@H_301_29@
    9. this@H_301_29@.password=psw;@H_301_29@
    10. this@H_301_29@.name=name;@H_301_29@
    11. this@H_301_29@.age=age;@H_301_29@
    12. this@H_301_29@.gender=gender.getValue();@H_301_29@
    13. public@H_301_29@StringgetUserId(){@H_301_29@
    14. return@H_301_29@userId;@H_301_29@
    15. public@H_301_29@StringgetPassword(){@H_301_29@
    16. return@H_301_29@password;@H_301_29@
    17. public@H_301_29@StringgetName(){@H_301_29@
    18. return@H_301_29@name;@H_301_29@
    19. int@H_301_29@getAge(){@H_301_29@
    20. return@H_301_29@age;@H_301_29@
    21. public@H_301_29@StringgetGender(){@H_301_29@
    22. return@H_301_29@gender;@H_301_29@
    23. class@H_301_29@NameSpace{@H_301_29@
    24. static@H_301_29@final@H_301_29@StringADMIN_PREFIX="admin"@H_301_29@;@H_301_29@
    25. final@H_301_29@StringADMIN_URI="http://www.company.com/management/employees/admin"@H_301_29@;@H_301_29@
    26. enum@H_301_29@Gender{@H_301_29@
    27. MALE("Male"@H_301_29@),@H_301_29@
    28. FEMALE("Female"@H_301_29@);@H_301_29@
    29. private@H_301_29@Stringvalue;@H_301_29@
    30. private@H_301_29@Gender(Stringvalue){@H_301_29@
    31. this@H_301_29@.value=value;@H_301_29@
    32. public@H_301_29@StringgetValue(){@H_301_29@
    33. return@H_301_29@this@H_301_29@.value;@H_301_29@
    34. 创建package-info.java注册xmlns,将该文件放在当前source code的package下面,如果不使用namespace可以不创建该文件

      @XmlSchema@H_301_29@(@H_301_29@
    35. xmlns={@H_301_29@
    36. @XmlNs@H_301_29@(prefix=NameSpace.ADMIN_PREFIX,namespaceURI=NameSpace.ADMIN_URI)@H_301_29@
    37. )@H_301_29@
    38. import@H_301_29@javax.xml.bind.annotation.XmlNs;@H_301_29@
    39. import@H_301_29@javax.xml.bind.annotation.XmlSchema;@H_301_29@

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

Employees@H_301_29@
  • Employee@H_301_29@
  • @H_196_301@import@H_301_29@java.io.InputStream;@H_301_29@
  • import@H_301_29@java.io.StringWriter;@H_301_29@
  • import@H_301_29@javax.xml.bind.JAXBContext;@H_301_29@
  • import@H_301_29@javax.xml.bind.JAXBException;@H_301_29@
  • import@H_301_29@javax.xml.bind.Marshaller;@H_301_29@
  • import@H_301_29@javax.xml.bind.Unmarshaller;@H_301_29@
  • final@H_301_29@class@H_301_29@XMLParser{@H_301_29@
  • private@H_301_29@XMLParser(){}@H_301_29@
  • static@H_301_29@Objectunmarshal(InputStreamxml,Class<?>clazz){@H_301_29@
  • Objectobj=null@H_301_29@;@H_301_29@
  • try@H_301_29@{@H_301_29@
  • JAXBContextjc=JAXBContext.newInstance(clazz.getPackage().getName());@H_301_29@
  • Unmarshalleru=jc.createUnmarshaller();@H_301_29@
  • obj=u.unmarshal(xml);@H_301_29@
  • }catch@H_301_29@(JAXBExceptione){@H_301_29@
  • throw@H_301_29@new@H_301_29@RuntimeException("Can'tunmarshaltheXMLfile,errormessage:"@H_301_29@+e.getMessage());@H_301_29@
  • return@H_301_29@obj;@H_301_29@
  • static@H_301_29@Stringmarshal(Objectobj,250); line-height:18px"> Stringresult= Marshallerm=jc.createMarshaller();@H_301_29@
  • StringWriterwriter=new@H_301_29@StringWriter();@H_301_29@
  • m.marshal(obj,writer);@H_301_29@
  • result=writer.toString();@H_301_29@
  • new@H_301_29@RuntimeException("Can'tmarshaltheXMLfile,85); font-weight:bold">return@H_301_29@result;@H_301_29@
  • import@H_301_29@java.io.File;@H_301_29@
  • import@H_301_29@java.io.FileInputStream;@H_301_29@
  • import@H_301_29@java.io.FileNotFoundException;@H_301_29@
  • class@H_301_29@Test{@H_301_29@
  • void@H_301_29@main(String[]args)throws@H_301_29@FileNotFoundException{@H_301_29@
  • testUnmarshal();@H_301_29@
  • testMarshal();@H_301_29@
  • void@H_301_29@testUnmarshal() Employeesemployees=(Employees)XMLParser.unmarshal(@H_301_29@
  • new@H_301_29@FileInputStream(new@H_301_29@File("F:\\workspace\\JavaStudy\\test\\employees.xml"@H_301_29@)),250); line-height:18px"> Employees.class@H_301_29@);@H_301_29@
  • List<Employee>employeeList=employees.getEmployees();@H_301_29@
  • if@H_301_29@(employeeList!=null@H_301_29@&&employeeList.size()>0@H_301_29@){@H_301_29@
  • for@H_301_29@(Employeeemployee:employeeList){@H_301_29@
  • StringBuilderbuilder=new@H_301_29@StringBuilder();@H_301_29@
  • builder.append("[UserID:"@H_301_29@).append(employee.getUserId()).append(","@H_301_29@)@H_301_29@
  • .append("Password:"@H_301_29@).append(employee.getPassword()).append(",250); line-height:18px"> .append("Name:"@H_301_29@).append(employee.getName()).append(",250); line-height:18px"> .append("Age:"@H_301_29@).append(employee.getAge()).append(",250); line-height:18px"> .append("Gender"@H_301_29@).append(employee.getGender()).append("]"@H_301_29@);@H_301_29@
  • System.out.println(builder.toString());@H_301_29@
  • void@H_301_29@testMarshal(){@H_301_29@
  • Employeesemployees=new@H_301_29@Employees();@H_301_29@
  • employees.addEmployee(new@H_301_29@Employee("johnsmith@company.com"@H_301_29@,"abc123_"@H_301_29@,"JohnSmith"@H_301_29@,24@H_301_29@,Gender.MALE));@H_301_29@
  • new@H_301_29@Employee("christinechen@company.com"@H_301_29@,"123456"@H_301_29@,"ChristineChen"@H_301_29@,0)">27@H_301_29@,Gender.FEMALE));@H_301_29@
  • Stringresult=XMLParser.marshal(employees,Employees. System.out.println(result);@H_301_29@
  • 6. 运行结果:

    [UserID:johnsmith@company@H_301_29@.com,Password:abc123_,Name:JohnSmith,Age:301_29@
  • [UserID:christinechen123456@H_301_29@,Name:ChristineChen,GenderFemale]@H_301_29@
  • <?xmlversion="1.0"@H_301_29@encoding="UTF-8"@H_301_29@standalone="yes"@H_301_29@?><employeesxmlns:admin="http://www.company.com/management/employees/admin"@H_301_29@><admin:employee><admin:userId>johnsmith@company@H_301_29@.com</admin:userId><admin:password>abc123_</admin:password><admin:name>JohnSmith</admin:name><admin:age>24@H_301_29@</admin:age><admin:gender>Male</admin:gender></admin:employee><admin:employee><admin:userId>christinechen@company@H_301_29@.com</admin:userId><admin:password>123456@H_301_29@</admin:password><admin:name>ChristineChen</admin:name><admin:age>27@H_301_29@</admin:age><admin:gender>Female</admin:gender></admin:employee></employees> @H_301_29@
  • 上面这个是涉及到 命名空间的但是他这个列子,跟我这个有点区别,所以有看了 下面这个例子@H_301_29@

    最近项目中用到了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/samplechildbenxmlns: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">

    猜你在找的XML相关文章