网上找了很多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/
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()); }
- <?@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@
- <@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@
- 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@
- @H_301_29@
- import@H_301_29@java.util.ArrayList;@H_301_29@
- import@H_301_29@java.util.List;@H_301_29@
- import@H_301_29@javax.xml.bind.annotation.XmlElement;@H_301_29@
- import@H_301_29@javax.xml.bind.annotation.XmlRootElement;@H_301_29@
- @XmlRootElement@H_301_29@(name="employees"@H_301_29@)@H_301_29@
- public@H_301_29@class@H_301_29@Employees{@H_301_29@
- @XmlElement@H_301_29@(name="employee"@H_301_29@,namespace=NameSpace.ADMIN_URI)@H_301_29@
- private@H_301_29@List<Employee>employees;@H_301_29@
- public@H_301_29@Employees(){@H_301_29@
- employees=new@H_301_29@ArrayList<Employee>();@H_301_29@
- }@H_301_29@
- public@H_301_29@List<Employee>getEmployees(){@H_301_29@
- return@H_301_29@employees;@H_301_29@
- void@H_301_29@addEmployee(Employeeemployee){@H_301_29@
- employees.add(employee);@H_301_29@
- }@H_301_29@
- @XmlElement@H_301_29@(name="userId"@H_301_29@,85); font-weight:bold">private@H_301_29@StringuserId;@H_301_29@
- @XmlElement@H_301_29@(name="password"@H_301_29@,85); font-weight:bold">private@H_301_29@Stringpassword;@H_301_29@
- @XmlElement@H_301_29@(name="name"@H_301_29@,85); font-weight:bold">private@H_301_29@Stringname;@H_301_29@
- @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@
- @XmlElement@H_301_29@(name="gender"@H_301_29@,85); font-weight:bold">private@H_301_29@Stringgender;@H_301_29@
- public@H_301_29@Employee(){@H_301_29@
- public@H_301_29@Employee(StringuserId,Stringpsw,Stringname,int@H_301_29@age,Gendergender){@H_301_29@
- this@H_301_29@.userId=userId;@H_301_29@
- this@H_301_29@.password=psw;@H_301_29@
- this@H_301_29@.name=name;@H_301_29@
- this@H_301_29@.age=age;@H_301_29@
- this@H_301_29@.gender=gender.getValue();@H_301_29@
- public@H_301_29@StringgetUserId(){@H_301_29@
- return@H_301_29@userId;@H_301_29@
- public@H_301_29@StringgetPassword(){@H_301_29@
- return@H_301_29@password;@H_301_29@
- public@H_301_29@StringgetName(){@H_301_29@
- return@H_301_29@name;@H_301_29@
- int@H_301_29@getAge(){@H_301_29@
- return@H_301_29@age;@H_301_29@
- public@H_301_29@StringgetGender(){@H_301_29@
- return@H_301_29@gender;@H_301_29@
- class@H_301_29@NameSpace{@H_301_29@
- static@H_301_29@final@H_301_29@StringADMIN_PREFIX="admin"@H_301_29@;@H_301_29@
- final@H_301_29@StringADMIN_URI="http://www.company.com/management/employees/admin"@H_301_29@;@H_301_29@
- enum@H_301_29@Gender{@H_301_29@
- MALE("Male"@H_301_29@),@H_301_29@
- FEMALE("Female"@H_301_29@);@H_301_29@
- private@H_301_29@Stringvalue;@H_301_29@
- private@H_301_29@Gender(Stringvalue){@H_301_29@
- this@H_301_29@.value=value;@H_301_29@
- public@H_301_29@StringgetValue(){@H_301_29@
- return@H_301_29@this@H_301_29@.value;@H_301_29@
- 创建package-info.java注册xmlns,将该文件放在当前source code的package下面,如果不使用namespace可以不创建该文件
@XmlSchema@H_301_29@(@H_301_29@
- xmlns={@H_301_29@
- @XmlNs@H_301_29@(prefix=NameSpace.ADMIN_PREFIX,namespaceURI=NameSpace.ADMIN_URI)@H_301_29@
- )@H_301_29@
- import@H_301_29@javax.xml.bind.annotation.XmlNs;@H_301_29@
- import@H_301_29@javax.xml.bind.annotation.XmlSchema;@H_301_29@
创建jaxb.index注册Employees,Employee,如果不使用包级context,可以不创建该文件
@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@
核心的就是这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文件,用于展示组织内部的成员(employee)状况,这里有一点需要注意的是使用了namespace,这也是本文将要演示的重点。
- package@H_301_29@com.javaeye.terrencexu.jaxb;@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">