概述
前面有介绍过json-lib这个框架,在线博文:http://www.uoften.com/
以及Jackson这个框架,在线博文:http://www.uoften.com/
它们都可以完成Java对象到XML的转换,但是还不是那么的完善。
还有XStream对JSON及XML的支持,它可以对JSON或XML的完美转换。在线博文:
http://www.uoften.com/
以及介绍Castor来完成Java对象到xml的相互转换。在线博文:http://www.uoften.com/
Jaxb2完成xml的转换,在线博文:http://www.uoften.com/
Jibx对Java对象的转换相对要负责些,它不仅需要配置xml还且还要生成相应的jar文件,已经xsd文件。下面我们就来慢慢看看Jibx转换Java到XML是如何完成的。
一、 准备工作
1、 准备资源
a) 官方示例:http://www.uoften.com/
http://www.uoften.com/
b) Jar下载:http://www.uoften.com/
c) 依赖jar包如下:
2、 程序准备代码
package com.hoo.test;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
import java.io.IOException;
登录后复制
import java.io.StringReader;
登录后复制
import java.io.StringWriter;
登录后复制
import java.util.ArrayList;
登录后复制
import java.util.HashMap;
登录后复制
登录后复制
import java.util.List;
登录后复制
import org.jibx.runtime.BindingDirectory;
登录后复制
import org.jibx.runtime.IBindingFactory;
登录后复制
import org.jibx.runtime.IMarshallingContext;
登录后复制
import org.jibx.runtime.IUnmarshallingContext;
登录后复制
import org.jibx.runtime.JiBXException;
登录后复制
import org.junit.After;
登录后复制
import org.junit.Before;
登录后复制
import org.junit.Test;
登录后复制
import com.hoo.entity.Account;
登录后复制
import com.hoo.entity.AccountArray;
登录后复制
import com.hoo.entity.Birthday;
登录后复制
import com.hoo.entity.ListBean;
登录后复制
import com.hoo.entity.MapBean;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
/**
登录后复制
* function: Jibx转换Java到XML
登录后复制
* @author hoojo
登录后复制
* @createDate 2011-4-25 下午06:47:33
登录后复制
* @file JibxTest.java
登录后复制
* @package com.hoo.test
登录后复制
* @project WebHttpUtils
登录后复制
* @blog http://www.uoften.com/
登录后复制
* @email hoojo_@126.com
登录后复制
* @version 1.0
登录后复制
*/
登录后复制
public class JibxTest {
登录后复制
private IBindingFactory factory = null;
登录后复制
登录后复制
登录后复制
登录后复制
private StringWriter writer = null;
登录后复制
private StringReader reader = null;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
private Account bean = null;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
@Before
登录后复制
public void init() {
登录后复制
bean = new Account();
登录后复制
bean.setAddress("北京");
登录后复制
bean.setEmail("email");
登录后复制
bean.setId(1);
登录后复制
bean.setName("jack");
登录后复制
Birthday day = new Birthday();
登录后复制
day.setBirthday("2010-11-22");
登录后复制
bean.setBirthday(day);
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
try {
登录后复制
登录后复制
factory = BindingDirectory.getFactory(Account.class);
登录后复制
} catch (JiBXException e) {
登录后复制
e.printStackTrace();
登录后复制
登录后复制
}
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
@After
登录后复制
public void destory() {
登录后复制
bean = null;
登录后复制
try {
登录后复制
登录后复制
if (writer != null) {
登录后复制
writer.flush();
登录后复制
writer.close();
登录后复制
}
登录后复制
if (reader != null) {
登录后复制
reader.close();
登录后复制
}
登录后复制
} catch (IOException e) {
登录后复制
e.printStackTrace();
登录后复制
登录后复制
}
登录后复制
登录后复制
System.gc();
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public void fail(Object o) {
登录后复制
System.out.println(o);
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public void failRed(Object o) {
登录后复制
System.err.println(o);
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
IBindingFactory是一个工厂接口,通过BindingDirectory的getFactory工厂方法可以获得某个对象。然后通过这个工程可以获得转换xml文档的上下文。
二、 转换Java到XML、转换XML到Java
1、 转换JavaEntity对象
a) 首先看看Account、Birthday的代码
package com.hoo.entity;
public class Account {
private int id;
private String name;
private String email;
private String address;
private Birthday birthday;
//getter、setter
@Override
public String toString() {
return this.id + "#" + this.name + "#" + this.email + "#" + this.address + "#" + this.birthday;
}
}
登录后复制
Birthday
package com.hoo.entity;
public class Birthday {
private String birthday;
public Birthday(String birthday) {
super();
this.birthday = birthday;
}
//getter、setter
public Birthday() {}
@Override
public String toString() {
return this.birthday;
}
}
登录后复制
b) 程序代码
@Test
登录后复制
登录后复制
public void bean2XML() {
登录后复制
try {
登录后复制
登录后复制
writer = new StringWriter();
登录后复制
// marshal 编组
登录后复制
登录后复制
IMarshallingContext mctx = factory.createMarshallingContext();
登录后复制
登录后复制
mctx.setIndent(2);
登录后复制
登录后复制
mctx.marshalDocument(bean, "UTF-8", null, writer);
登录后复制
fail(writer);
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
reader = new StringReader(writer.toString());
登录后复制
登录后复制
//unmarshal 解组
登录后复制
登录后复制
IUnmarshallingContext uctx = factory.createUnmarshallingContext();
登录后复制
登录后复制
Account acc = (Account) uctx.unmarshalDocument(reader, null);
登录后复制
fail(acc);
登录后复制
} catch (Exception e) {
登录后复制
登录后复制
e.printStackTrace();
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
这样还不够,复杂的东西还在后面。Jibx转换XML文档还要经过一系列复杂的程序。
c) 首先,要写bind.xml和schema。不过还好,官方有提高工具类可以用。
org.jibx.binding.generator.BindGen或org.jibx.binding.BindingGenerator这两个类都可以,用法如下:
首先用dos进入当前工程目录,然后执行命令:E:/Study/WebHttpUtils>java -cp bin;lib/jibx-tools.jar;lib/log4j-1.2.16.jar org.jibx.binding.generator.BindGen -b bind.xml com.hoo.entity.Account
上面的java 是运行某个程序 –cp是依赖的classpath路径的jar、zip等文件,-b 是输出文件名称,是BindGen类的参数。这样会在当前工程目录中生成bind.xml和entity.xsd文件。先看看这2个文件
bind.xml
?xml version="1.0" encoding="UTF-8"?>
登录后复制
登录后复制
登录后复制
登录后复制
binding value-style="attribute">
登录后复制
登录后复制
登录后复制
mapping class="com.hoo.entity.Account" name="account">
登录后复制
value name="id" field="id"/>
登录后复制
value style="element" name="name" field="name" usage="optional"/>
登录后复制
value style="element" name="email" field="email" usage="optional"/>
登录后复制
value style="element" name="address" field="address" usage="optional"/>
登录后复制
structure field="birthday" usage="optional" name="birthday">
登录后复制
value style="element" name="birthday" field="birthday" usage="optional"/>
登录后复制
/structure>
登录后复制
/mapping>
登录后复制
/binding>
登录后复制
entity.xsd文件
xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://hoo.com/entity"
elementFormDefault="qualified" targetNamespace="http://hoo.com/entity">
xs:element type="tns:account" name="account"/>
xs:complexType name="account">
xs:sequence>
xs:element type="xs:string" name="name" minOccurs="0"/>
xs:element type="xs:string" name="email" minOccurs="0"/>
xs:element type="xs:string" name="address" minOccurs="0"/>
xs:element name="birthday" minOccurs="0">
xs:complexType>
xs:sequence>
xs:element type="xs:string" name="birthday" minOccurs="0"/>
/xs:sequence>
/xs:complexType>
/xs:element>
/xs:sequence>
xs:attribute type="xs:int" use="required" name="id"/>
/xs:complexType>
/xs:schema>
登录后复制
上面最重要的就是bind.xml文件了,下面编译的时候需要这个文件。Xsd文件可以根据这个文件的内容生成Java的Entity类代码。
执行完命令后,没有错误就可以运行下面一段命令了。运行命令:
E:/Study/WebHttpUtils>java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml
-v是绑定文件的名称
运行后,有如下结果:
d) 然后你就可以运行上面的Java的Junit测试程序了,运行后结果如下:
?xml version="1.0" encoding="UTF-8"?>
account xmlns="http://hoo.com/entity" id="1">
name>jack/name>
email>email/email>
address>北京/address>
birthday>
birthday>2010-11-22/birthday>
/birthday>
/account>
1#jack#email#北京#2010-11-22
登录后复制
你还可以用命令来查看某个已经生成bind、schema文件的信息,如:
java -cp bin;lib/jibx-run.jar org.jibx.runtime.PrintInfo -c com.hoo.entity.Account
结果如下:
e) 注意,有时候会出现异常信息,如:java.lang.NoSuchFieldException: JiBX_bindingXXXX就要重复下面的命令就可以了。
java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml
2、 转换带List集合属性的JavaBean
a) 程序代码
@Test
登录后复制
登录后复制
public void listBean2XML() {
登录后复制
try {
登录后复制
登录后复制
ListBean listBean = new ListBean();
登录后复制
Listlist = new ArrayList();
登录后复制
list.add(bean);
登录后复制
bean = new Account();
登录后复制
bean.setAddress("china");
登录后复制
bean.setEmail("tom@125.com");
登录后复制
bean.setId(2);
登录后复制
bean.setName("tom");
登录后复制
Birthday day = new Birthday("2010-11-22");
登录后复制
bean.setBirthday(day);
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
list.add(bean);
登录后复制
listBean.setList(list);
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
writer = new StringWriter();
登录后复制
factory = BindingDirectory.getFactory(ListBean.class);
登录后复制
// marshal 编组
登录后复制
登录后复制
IMarshallingContext mctx = factory.createMarshallingContext();
登录后复制
登录后复制
mctx.setIndent(2);
登录后复制
登录后复制
mctx.marshalDocument(listBean, "UTF-8", null, writer);
登录后复制
fail(writer);
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
reader = new StringReader(writer.toString());
登录后复制
登录后复制
//unmarshal 解组
登录后复制
登录后复制
IUnmarshallingContext uctx = factory.createUnmarshallingContext();
登录后复制
登录后复制
listBean = (ListBean) uctx.unmarshalDocument(reader, null);
登录后复制
登录后复制
登录后复制
fail(listBean.getList().get(0));
登录后复制
fail(listBean.getList().get(1));
登录后复制
} catch (Exception e) {
登录后复制
登录后复制
e.printStackTrace();
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
b) ListBean代码
package com.hoo.entity;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
import java.util.List;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public class ListBean {
登录后复制
private String name;
登录后复制
private List list;
登录后复制
}
登录后复制
登录后复制
登录后复制
c) 生成bind.xml
执行dos命令:
java -cp bin;lib/jibx-tools.jar;lib/log4j-1.2.16.jar org.jibx.binding.BindingGenerator -f bind.xml com.hoo.entity.ListBean
输出:
d) 执行完后会生产bind.xml
Bind文件
?xml version="1.0" encoding="UTF-8"?>
登录后复制
登录后复制
登录后复制
登录后复制
binding value-style="attribute">
登录后复制
登录后复制
登录后复制
mapping class="com.hoo.entity.ListBean" name="list-bean">
登录后复制
value style="element" name="name" field="name" usage="optional"/>
登录后复制
collection field="list" usage="optional" factory="org.jibx.runtime.Utility.arrayListFactory"/>
登录后复制
/mapping>
登录后复制
/binding>
登录后复制
登录后复制
e) 运行Compile工具类
在运行前,一定要将最先前运行的Account那个类的bind.xml文件的内容加入到现在这个bind.xml中,因为ListBean依赖了Account这个类。
命令如下:
java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml
运行后你可以看到最后出现这个
f) 运行Test程序,结果如下:
?xml version="1.0" encoding="UTF-8"?>
list-bean>
account id="1">
name>jack/name>
email>email/email>
address>北京/address>
birthday>
birthday>2010-11-22/birthday>
/birthday>
/account>
account id="2">
name>tom/name>
email>tom@125.com/email>
address>china/address>
birthday>
birthday>2010-11-22/birthday>
/birthday>
/account>
/list-bean>
1#jack#email#北京#2010-11-22
2#tom#tom@125.com#china#2010-11-22
登录后复制
3、 转换Java对象数组
a) Test程序
/**
* function:转换对象数组
* @author hoojo
* @createDate 2011-4-26 下午05:32:03
*/
@Test
public void arrayBean2XML() {
try {
Account[] acc = new Account[2];
acc[0] = bean;
bean = new Account();
bean.setName("tom");
bean.setId(223);
acc[1] = bean;
AccountArray array = new AccountArray();
array.setAccounts(acc);
writer = new StringWriter();
factory = BindingDirectory.getFactory(AccountArray.class);
// marshal 编组
IMarshallingContext mctx = factory.createMarshallingContext();
mctx.setIndent(2);
mctx.marshalDocument(array, "UTF-8", null, writer);
fail(writer);
reader = new StringReader(writer.toString());
//unmarshal 解组
IUnmarshallingContext uctx = factory.createUnmarshallingContext();
array = (AccountArray) uctx.unmarshalDocument(reader, null);
fail(array.getAccounts()[0]);
fail(array.getAccounts()[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
登录后复制
b) AccountArray代码
package com.hoo.entity;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public class AccountArray {
登录后复制
private Account[] accounts;
登录后复制
private int size;
登录后复制
public int getSize() {
登录后复制
size = accounts.length;
登录后复制
return size;
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public void setSize(int size) {
登录后复制
this.size = size;
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public Account[] getAccounts() {
登录后复制
return accounts;
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public void setAccounts(Account[] accounts) {
登录后复制
this.accounts = accounts;
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
c) 运行命令生成bind.xml文件
命令如下:
java -cp bin;lib/jibx-tools.jar;lib/log4j-1.2.16.jar org.jibx.binding.BindingGenerator -f bind.xml com.hoo.entity.Account com.hoo.entity.AccountArray
因为AccountArray依赖Account,所以后面带2个类
d) 运行Compile命令
java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml
e) 执行完后,就可以运行Test程序了,结果如下
?xml version="1.0" encoding="UTF-8"?>
登录后复制
登录后复制
登录后复制
登录后复制
account-array size="0">
登录后复制
account id="1">
登录后复制
name>jack/name>
登录后复制
email>email/email>
登录后复制
address>北京/address>
登录后复制
birthday>
登录后复制
birthday>2010-11-22/birthday>
登录后复制
/birthday>
登录后复制
/account>
登录后复制
account id="223">
登录后复制
name>tom/name>
登录后复制
/account>
登录后复制
/account-array>
登录后复制
1#jack#email#北京#2010-11-22
登录后复制
223#tom#null#null#null
登录后复制
4、 转换带Map结合的JavaEntity对象
a) Test代码
/**
* function:转换Map集合
* @author hoojo
* @createDate 2011-4-26 下午05:40:34
*/
@Test
public void mapBean2XML() {
try {
MapBean mapBean = new MapBean();
HashMapmap = new HashMap();
map.put("No1", bean);
bean = new Account();
bean.setAddress("china");
bean.setEmail("tom@125.com");
bean.setId(2);
bean.setName("tom");
Birthday day = new Birthday("2010-11-22");
bean.setBirthday(day);
map.put("No2", bean);
mapBean.setMap(map);
factory = BindingDirectory.getFactory(MapBean.class);
writer = new StringWriter();
// marshal 编组
IMarshallingContext mctx = factory.createMarshallingContext();
mctx.setIndent(2);
mctx.marshalDocument(mapBean, "UTF-8", null, writer);
fail(writer);
reader = new StringReader(writer.toString());
//unmarshal 解组
IUnmarshallingContext uctx = factory.createUnmarshallingContext();
mapBean = (MapBean) uctx.unmarshalDocument(reader, null);
fail(mapBean.getMap());
fail(mapBean.getMap().get("No1"));
fail(mapBean.getMap().get("No2"));
} catch (Exception e) {
e.printStackTrace();
}
}
登录后复制
b) MapBean代码
package com.hoo.entity;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
import java.util.HashMap;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public class MapBean {
登录后复制
private HashMapmap;
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public HashMapgetMap() {
登录后复制
return map;
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
public void setMap(HashMapmap) {
登录后复制
this.map = map;
登录后复制
}
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
}
登录后复制
登录后复制
登录后复制
c) 生成bind.xml,命令如下
E:/Study/WebHttpUtils>java -cp bin;lib/jibx-tools.jar;lib/log4j-1.2.16.jar org.jibx.binding.BindingGenerator -f bind.xml com.hoo.entity.Account com.hoo.entity.MapBean
运行后,会生产bind.xml;修改bind.xml内容如下:
?xml version="1.0" encoding="UTF-8"?>
登录后复制
登录后复制
登录后复制
登录后复制
binding value-style="attribute">
登录后复制
登录后复制
登录后复制
mapping class="com.hoo.entity.Account" name="account">
登录后复制
value name="id" field="id" />
登录后复制
value style="element" name="name" field="name" usage="optional" />
登录后复制
value style="element" name="email" field="email" usage="optional" />
登录后复制
value style="element" name="address" field="address" usage="optional" />
登录后复制
structure field="birthday" usage="optional" name="birthday">
登录后复制
value style="element" name="birthday" field="birthday" usage="optional" />
登录后复制
/structure>
登录后复制
/mapping>
登录后复制
mapping class="com.hoo.entity.MapBean" name="map-bean">
登录后复制
structure field="map" usage="optional" name="map"
登录后复制
marshaller="com.hoo.util.HashMapper" unmarshaller="com.hoo.util.HashMapper">
登录后复制
/structure>
登录后复制
/mapping>
登录后复制
/binding>
登录后复制
登录后复制
注意上面的MapBean的structure元素的内容是经过修改的。一定要带上marshaller或unmarshaller,不然无法转换HashMap的。
d) HashMapper代码
package com.hoo.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.jibx.runtime.IAliasable;
import org.jibx.runtime.IMarshallable;
import org.jibx.runtime.IMarshaller;
import org.jibx.runtime.IMarshallingContext;
import org.jibx.runtime.IUnmarshaller;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;
import org.jibx.runtime.impl.MarshallingContext;
import org.jibx.runtime.impl.UnmarshallingContext;
/**
* function:http://www.uoften.com/
* @file HashMapper.java
* @package com.hoo.util
* @project WebHttpUtils
* @blog http://www.uoften.com/
* @email hoojo_@126.com
* @version 1.0
*/
public class HashMapper implements IMarshaller, IUnmarshaller, IAliasable
{
private static final String SIZE_ATTRIBUTE_NAME = "size";
private static final String ENTRY_ELEMENT_NAME = "entry";
private static final String KEY_ATTRIBUTE_NAME = "key";
private static final int DEFAULT_SIZE = 10;
private String m_uri;
private int m_index;
private String m_name;
public HashMapper() {
m_uri = null;
m_index = 0;
m_name = "hashmap";
}
public HashMapper(String uri, int index, String name) {
m_uri = uri;
m_index = index;
m_name = name;
}
/* (non-Javadoc)
* @see org.jibx.runtime.IMarshaller#isExtension(int)
*/
public boolean isExtension(int index) {
return false;
}
/* (non-Javadoc)
* @see org.jibx.runtime.IMarshaller#marshal(java.lang.Object,
* org.jibx.runtime.IMarshallingContext)
*/
public void marshal(Object obj, IMarshallingContext ictx)
throws JiBXException {
// make sure the parameters are as expected
if (!(obj instanceof HashMap)) {
throw new JiBXException("Invalid object type for marshaller");
} else if (!(ictx instanceof MarshallingContext)) {
throw new JiBXException("Invalid object type for marshaller");
} else {
// start by generating start tag for container
MarshallingContext ctx = (MarshallingContext)ictx;
HashMap map = (HashMap)obj;
ctx.startTagAttributes(m_index, m_name).
attribute(m_index, SIZE_ATTRIBUTE_NAME, map.size()).
closeStartContent();
// loop through all entries in hashmap
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
ctx.startTagAttributes(m_index, ENTRY_ELEMENT_NAME);
if (entry.getKey() != null) {
ctx.attribute(m_index, KEY_ATTRIBUTE_NAME,
entry.getKey().toString());
}
ctx.closeStartContent();
if (entry.getValue() instanceof IMarshallable) {
((IMarshallable)entry.getValue()).marshal(ctx);
ctx.endTag(m_index, ENTRY_ELEMENT_NAME);
} else {
throw new JiBXException("Mapped value is not marshallable");
}
}
// finish with end tag for container element
ctx.endTag(m_index, m_name);
}
}
/* (non-Javadoc)
* @see org.jibx.runtime.IUnmarshaller#isPresent(org.jibx.runtime.IUnmarshallingContext)
*/
public boolean isPresent(IUnmarshallingContext ctx) throws JiBXException {
return ctx.isAt(m_uri, m_name);
}
/* (non-Javadoc)
* @see org.jibx.runtime.IUnmarshaller#unmarshal(java.lang.Object,
* org.jibx.runtime.IUnmarshallingContext)
*/
public Object unmarshal(Object obj, IUnmarshallingContext ictx)
throws JiBXException {
// make sure we're at the appropriate start tag
UnmarshallingContext ctx = (UnmarshallingContext)ictx;
if (!ctx.isAt(m_uri, m_name)) {
ctx.throwStartTagNameError(m_uri, m_name);
}
// create new hashmap if needed
int size = ctx.attributeInt(m_uri, SIZE_ATTRIBUTE_NAME, DEFAULT_SIZE);
HashMap map = (HashMap)obj;
if (map == null) {
map = new HashMap(size);
}
// process all entries present in document
ctx.parsePastStartTag(m_uri, m_name);
while (ctx.isAt(m_uri, ENTRY_ELEMENT_NAME)) {
Object key = ctx.attributeText(m_uri, KEY_ATTRIBUTE_NAME, null);
ctx.parsePastStartTag(m_uri, ENTRY_ELEMENT_NAME);
Object value = ctx.unmarshalElement();
map.put(key, value);
ctx.parsePastEndTag(m_uri, ENTRY_ELEMENT_NAME);
}
ctx.parsePastEndTag(m_uri, m_name);
return map;
}
public boolean isExtension(String arg0) {
return false;
}
}
登录后复制
e) 然后运行Compile命令
E:/Study/WebHttpUtils>java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml
f) 结果如下
<?xml version="1.0" encoding="UTF-8"?>
<map-bean>
<map size="2">
<entry key="No2">
<account id="2">
<name>tom</name>
<email>tom@125.com</email>
<address>china</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
</account>
</entry>
<entry key="No1">
<account id="1">
<name>jack</name>
<email>email</email>
<address>北京</address>
<birthday>
<birthday>2010-11-22</birthday>
</birthday>
</account>
</entry>
</map>
</map-bean>
{No2=2#tom#tom@125.com#china#2010-11-22, No1=1#jack#email#北京#2010-11-22}
1#jack#email#北京#2010-11-22
2#tom#tom@125.com#china#2010-11-22
顶
登录后复制
以上就是Jibx 处理XML的内容,更多相关内容请关注靠谱客(www.uoften.com)!
最后
以上就是文艺春天为你收集整理的Jibx 处理XML的全部内容,希望文章能够帮你解决Jibx 处理XML所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复