Jibx gère XML

黄舟
Libérer: 2017-02-18 15:18:23
original
1841 Les gens l'ont consulté

J'ai déjà présenté le framework json-lib, article de blog en ligne : http://www.php.cn/

et le framework Jackson, article de blog en ligne : http://www.php. cn/

Ils peuvent tous convertir des objets Java en XML, mais ils ne sont pas encore aussi parfaits.

XStream prend également en charge JSON et XML, qui peuvent parfaitement convertir JSON ou XML. Blog en ligne :

http://www.php.cn/

et présentez Castor pour terminer la conversion des objets Java en XML. Blog en ligne : http://www.php.cn/

Jaxb2 termine la conversion du XML, blog en ligne : http://www.php.cn/

Jibx convertit les objets Java est relativement plus responsable. Il doit non seulement configurer XML, mais également générer les fichiers jar et xsd correspondants. Voyons comment Jibx convertit Java en XML.

1. Préparation

1. Préparation des ressources

a) Exemple officiel : http://www.php .cn/

http://www.php.cn/

b) Téléchargement du fichier Jar : http://www.php.cn/

c) Dépend de jar Le package est le suivant :

Jibx gère XML

2. Code de préparation du programme



package com.hoo.test;
Copier après la connexion

 <br>
Copier après la connexion
Copier après la connexion

import java.io.IOException;
Copier après la connexion

import java.io.StringReader;
Copier après la connexion

import java.io.StringWriter;
Copier après la connexion

import java.util.ArrayList;
Copier après la connexion

import java.util.HashMap;
Copier après la connexion

import java.util.List;
Copier après la connexion

import org.jibx.runtime.BindingDirectory;
Copier après la connexion

import org.jibx.runtime.IBindingFactory;
Copier après la connexion

import org.jibx.runtime.IMarshallingContext;
Copier après la connexion

import org.jibx.runtime.IUnmarshallingContext;
Copier après la connexion

import org.jibx.runtime.JiBXException;
Copier après la connexion

import org.junit.After;
Copier après la connexion

import org.junit.Before;
Copier après la connexion

import org.junit.Test;
Copier après la connexion

import com.hoo.entity.Account;
Copier après la connexion
>

import com.hoo.entity.AccountArray;
Copier après la connexion

import com.hoo.entity.Birthday;
Copier après la connexion

import com.hoo.entity.ListBean;
Copier après la connexion

import com.hoo.entity.MapBean;
Copier après la connexion

 <br>
Copier après la connexion
Copier après la connexion

/**
Copier après la connexion

 * function: Jibx转换Java到XML
Copier après la connexion

 * @author hoojo
Copier après la connexion

 * @createDate 2011-4-25 下午06:47:33
Copier après la connexion

 * @file JibxTest.java
Copier après la connexion

 * @package com.hoo.test
Copier après la connexion

 * @project WebHttpUtils
Copier après la connexion

 * @blog http://www.php.cn/
Copier après la connexion

 * @email hoojo_@126.com
Copier après la connexion

 * @version 1.0
Copier après la connexion

 */
Copier après la connexion

public class JibxTest {
Copier après la connexion

    private IBindingFactory factory = null;
Copier après la connexion

    <br>
Copier après la connexion
Copier après la connexion
Copier après la connexion

    private StringWriter writer = null;
Copier après la connexion

    private StringReader reader = null;
Copier après la connexion

    <br>
Copier après la connexion
Copier après la connexion
Copier après la connexion

    private Account bean = null;
Copier après la connexion

    <br>
Copier après la connexion
Copier après la connexion
Copier après la connexion

>

    @Before
Copier après la connexion

    public void init() {
Copier après la connexion

        bean = new Account();
Copier après la connexion

        bean.setAddress("北京");
Copier après la connexion

        bean.setEmail("email");
Copier après la connexion

        bean.setId(1);
Copier après la connexion

        bean.setName("jack");
Copier après la connexion

        Birthday day = new Birthday();
Copier après la connexion

        day.setBirthday("2010-11-22");
Copier après la connexion

        bean.setBirthday(day);
Copier après la connexion

        <br>
Copier après la connexion

        try {
Copier après la connexion
Copier après la connexion

            factory = BindingDirectory.getFactory(Account.class);
Copier après la connexion

        } catch (JiBXException e) {
Copier après la connexion

            e.printStackTrace();
Copier après la connexion
Copier après la connexion

        }
Copier après la connexion
Copier après la connexion

    }
Copier après la connexion

    <br>
Copier après la connexion
Copier après la connexion
Copier après la connexion

    @After
Copier après la connexion

    public void destory() {
Copier après la connexion

        bean = null;
Copier après la connexion

        try {
Copier après la connexion
Copier après la connexion

            if (writer != null) {
Copier après la connexion

                writer.flush();
Copier après la connexion

>
                writer.close();
Copier après la connexion

            }
Copier après la connexion

            if (reader != null) {
Copier après la connexion

                reader.close();
Copier après la connexion

            }
Copier après la connexion

        } catch (IOException e) {
Copier après la connexion

            e.printStackTrace();
Copier après la connexion
Copier après la connexion

        }
Copier après la connexion
Copier après la connexion

        System.gc();
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion

    <br>
Copier après la connexion
Copier après la connexion
Copier après la connexion

    public void fail(Object o) {
Copier après la connexion

        System.out.println(o);
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion

    <br>
Copier après la connexion
Copier après la connexion
Copier après la connexion

    public void failRed(Object o) {
Copier après la connexion

        System.err.println(o);
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion
IBindingFactory est une interface d'usine, et un objet peut être obtenu via la méthode de fabrique getFactory de BindingDirectory. Ensuite, grâce à ce projet, vous pouvez obtenir le contexte de conversion du document XML.

二、 转换JavaXML、转换XMLJava

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;
   
    }
   
}
Copier après la connexion


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;
   
    }
   
}
Copier après la connexion


b) 程序代码



@Test
Copier après la connexion
Copier après la connexion

public void bean2XML() {
Copier après la connexion

    try {
Copier après la connexion
Copier après la connexion

        writer = new StringWriter();
Copier après la connexion

        // marshal 编组
Copier après la connexion
Copier après la connexion

        IMarshallingContext mctx = factory.createMarshallingContext();
Copier après la connexion
Copier après la connexion

        mctx.setIndent(2);
Copier après la connexion
Copier après la connexion

        mctx.marshalDocument(bean, "UTF-8", null, writer);
Copier après la connexion

        fail(writer);
Copier après la connexion
Copier après la connexion

        <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

        reader = new StringReader(writer.toString());
Copier après la connexion
Copier après la connexion

        //unmarshal 解组
Copier après la connexion
Copier après la connexion

        IUnmarshallingContext uctx = factory.createUnmarshallingContext();
Copier après la connexion
Copier après la connexion

        Account acc = (Account) uctx.unmarshalDocument(reader, null);
Copier après la connexion

        fail(acc);
Copier après la connexion

    } catch (Exception e) {
Copier après la connexion
Copier après la connexion

        e.printStackTrace();
Copier après la connexion
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
Copier après la connexion
Copier après la connexion
Copier après la connexion


这样还不够,复杂的东西还在后面。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"?>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

binding value-style="attribute">
Copier après la connexion
Copier après la connexion
Copier après la connexion

  mapping class="com.hoo.entity.Account" name="account">
Copier après la connexion

    value name="id" field="id"/>
Copier après la connexion

    value style="element" name="name" field="name" usage="optional"/>
Copier après la connexion

    value style="element" name="email" field="email" usage="optional"/>
Copier après la connexion

    value style="element" name="address" field="address" usage="optional"/>
Copier après la connexion

    structure field="birthday" usage="optional" name="birthday">
Copier après la connexion

      value style="element" name="birthday" field="birthday" usage="optional"/>
Copier après la connexion

    /structure>
Copier après la connexion

  /mapping>
Copier après la connexion

/binding>
Copier après la connexion


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>
Copier après la connexion


上面最重要的就是bind.xml文件了,下面编译的时候需要这个文件。Xsd文件可以根据这个文件的内容生成Java的Entity类代码。

执行完命令后,没有错误就可以运行下面一段命令了。运行命令:

E:/Study/WebHttpUtils>java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml

-v是绑定文件的名称

运行后,有如下结果:

Jibx gère XML

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
Copier après la connexion


你还可以用命令来查看某个已经生成bind、schema文件的信息,如:

java -cp bin;lib/jibx-run.jar org.jibx.runtime.PrintInfo -c com.hoo.entity.Account

结果如下:

Jibx gère XML

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
Copier après la connexion
Copier après la connexion

public void listBean2XML() {
Copier après la connexion

    try {
Copier après la connexion
Copier après la connexion

        ListBean listBean = new ListBean();
Copier après la connexion

        Listlist = new ArrayList();
Copier après la connexion

        list.add(bean);
Copier après la connexion

        bean = new Account();
Copier après la connexion

        bean.setAddress("china");
Copier après la connexion

        bean.setEmail("tom@125.com");
Copier après la connexion

        bean.setId(2);
Copier après la connexion

        bean.setName("tom");
Copier après la connexion

        Birthday day = new Birthday("2010-11-22");
Copier après la connexion

        bean.setBirthday(day);
Copier après la connexion

        <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

        list.add(bean);
Copier après la connexion

        listBean.setList(list);
Copier après la connexion

        <br/>
Copier après la connexion
Copier après la connexion

        <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

        writer = new StringWriter();
Copier après la connexion

        factory = BindingDirectory.getFactory(ListBean.class);
Copier après la connexion

        // marshal 编组
Copier après la connexion
Copier après la connexion

        IMarshallingContext mctx = factory.createMarshallingContext();
Copier après la connexion
Copier après la connexion

        mctx.setIndent(2);
Copier après la connexion
Copier après la connexion

        mctx.marshalDocument(listBean, "UTF-8", null, writer);
Copier après la connexion

        fail(writer);
Copier après la connexion
Copier après la connexion

        <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

        reader = new StringReader(writer.toString());
Copier après la connexion
Copier après la connexion

        //unmarshal 解组
Copier après la connexion
Copier après la connexion

        IUnmarshallingContext uctx = factory.createUnmarshallingContext();
Copier après la connexion
Copier après la connexion

        listBean = (ListBean) uctx.unmarshalDocument(reader, null);
Copier après la connexion

        <br/>
Copier après la connexion
Copier après la connexion

        fail(listBean.getList().get(0));
Copier après la connexion

        fail(listBean.getList().get(1));
Copier après la connexion

    } catch (Exception e) {
Copier après la connexion
Copier après la connexion

        e.printStackTrace();
Copier après la connexion
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
Copier après la connexion
Copier après la connexion
Copier après la connexion


b) ListBean代码



package com.hoo.entity;
Copier après la connexion
Copier après la connexion
Copier après la connexion

 <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

import java.util.List;
Copier après la connexion

 <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

public class ListBean {
Copier après la connexion

    private String name;
Copier après la connexion

    private List list;
Copier après la connexion

}
Copier après la connexion
Copier après la connexion


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

输出:

Jibx gère XML

d) 执行完后会生产bind.xml

Bind文件



?xml version="1.0" encoding="UTF-8"?>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

binding value-style="attribute">
Copier après la connexion
Copier après la connexion
Copier après la connexion

  mapping class="com.hoo.entity.ListBean" name="list-bean">
Copier après la connexion

    value style="element" name="name" field="name" usage="optional"/>
Copier après la connexion

    collection field="list" usage="optional" factory="org.jibx.runtime.Utility.arrayListFactory"/>
Copier après la connexion

  /mapping>
Copier après la connexion

/binding>
Copier après la connexion
Copier après la connexion


e) 运行Compile工具类

在运行前,一定要将最先前运行的Account那个类的bind.xml文件的内容加入到现在这个bind.xml中,因为ListBean依赖了Account这个类。

命令如下:

java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml

运行后你可以看到最后出现这个

Jibx gère 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
Copier après la connexion

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();
   
    }
   
}
Copier après la connexion


b) AccountArray代码



package com.hoo.entity;
Copier après la connexion
Copier après la connexion
Copier après la connexion

 <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

public class AccountArray {
Copier après la connexion

    private Account[] accounts;
Copier après la connexion

    private int size;
Copier après la connexion

    public int getSize() {
Copier après la connexion

        size = accounts.length;
Copier après la connexion

        return size;
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion

    public void setSize(int size) {
Copier après la connexion

        this.size = size;
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

    public Account[] getAccounts() {
Copier après la connexion

        return accounts;
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion

    public void setAccounts(Account[] accounts) {
Copier après la connexion

        this.accounts = accounts;
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
Copier après la connexion
Copier après la connexion
Copier après la connexion


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个类

Jibx gère XML

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"?>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

account-array size="0">
Copier après la connexion

  account id="1">
Copier après la connexion

    name>jack/name>
Copier après la connexion

    email>email/email>
Copier après la connexion

    address>北京/address>
Copier après la connexion

    birthday>
Copier après la connexion

      birthday>2010-11-22/birthday>
Copier après la connexion

    /birthday>
Copier après la connexion

  /account>
Copier après la connexion

  account id="223">
Copier après la connexion

    name>tom/name>
Copier après la connexion

  /account>
Copier après la connexion

/account-array>
Copier après la connexion

1#jack#email#北京#2010-11-22
Copier après la connexion

223#tom#null#null#null
Copier après la connexion


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();
   
    }
   
}
Copier après la connexion


b) MapBean代码



package com.hoo.entity;
Copier après la connexion
Copier après la connexion
Copier après la connexion

 <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

import java.util.HashMap;
Copier après la connexion

 <br/>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

public class MapBean {
Copier après la connexion

    private HashMapmap;
Copier après la connexion

    <br/>
Copier après la connexion

    public HashMapgetMap() {
Copier après la connexion

        return map;
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

    public void setMap(HashMapmap) {
Copier après la connexion

        this.map = map;
Copier après la connexion

    }
Copier après la connexion
Copier après la connexion
Copier après la connexion

}
Copier après la connexion
Copier après la connexion


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"?>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

binding value-style="attribute">
Copier après la connexion
Copier après la connexion
Copier après la connexion

    mapping class="com.hoo.entity.Account" name="account">
Copier après la connexion

        value name="id" field="id" />
Copier après la connexion

        value style="element" name="name" field="name" usage="optional" />
Copier après la connexion

        value style="element" name="email" field="email" usage="optional" />
Copier après la connexion

        value style="element" name="address" field="address" usage="optional" />
Copier après la connexion

        structure field="birthday" usage="optional" name="birthday">
Copier après la connexion

            value style="element" name="birthday" field="birthday" usage="optional" />
Copier après la connexion

        /structure>
Copier après la connexion

    /mapping>
Copier après la connexion

    mapping class="com.hoo.entity.MapBean" name="map-bean">
Copier après la connexion

        structure field="map" usage="optional" name="map"
Copier après la connexion

            marshaller="com.hoo.util.HashMapper" unmarshaller="com.hoo.util.HashMapper">
Copier après la connexion

        /structure>
Copier après la connexion

    /mapping>
Copier après la connexion

/binding>
Copier après la connexion
Copier après la connexion


注意上面的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.php.cn/ 
 * @file HashMapper.java
 * @package com.hoo.util   
 * @project WebHttpUtils   
 * @blog http://www.php.cn/   
 * @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&#39;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;
   
    }
   
}
Copier après la connexion


e) 然后运行Compile命令

E:/Study/WebHttpUtils>java -cp bin;lib/jibx-bind.jar org.jibx.binding.Compile -v bind.xml

f) 结果如下


  
    
      
        tom
        tom@125.com
        
china
2010-11-22
jack email
北京
2010-11-22
{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 顶
Copier après la connexion

 以上就是Jibx 处理XML的内容,更多相关内容请关注PHP中文网(www.php.cn)!












Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal