Jibx 处理XML

Feb 18, 2017 pm 03:18 PM

前面有介绍过json-lib这个框架,在线博文:http://www.php.cn/

以及Jackson这个框架,在线博文:http://www.php.cn/

它们都可以完成Java对象到XML的转换,但是还不是那么的完善。

还有XStream对JSON及XML的支持,它可以对JSON或XML的完美转换。在线博文:

http://www.php.cn/

以及介绍Castor来完成Java对象到xml的相互转换。在线博文:http://www.php.cn/

Jaxb2完成xml的转换,在线博文:http://www.php.cn/

Jibx对Java对象的转换相对要负责些,它不仅需要配置xml还且还要生成相应的jar文件,已经xsd文件。下面我们就来慢慢看看Jibx转换Java到XML是如何完成的。

一、 准备工作

1、 准备资源

a) 官方示例:http://www.php.cn/

http://www.php.cn/

b) Jar下载:http://www.php.cn/

c) 依赖jar包如下:

clip_image002

2、 程序准备代码



package com.hoo.test;
登录后复制

   

 <br>
登录后复制
登录后复制

   

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;
登录后复制

   

 <br>
登录后复制
登录后复制

   

/**
登录后复制

   

 * 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.php.cn/
登录后复制

   

 * @email hoojo_@126.com
登录后复制

   

 * @version 1.0
登录后复制

   

 */
登录后复制

   

public class JibxTest {
登录后复制

   

    private IBindingFactory factory = null;
登录后复制

   

    <br>
登录后复制
登录后复制
登录后复制

   

    private StringWriter writer = null;
登录后复制

   

    private StringReader reader = null;
登录后复制

   

    <br>
登录后复制
登录后复制
登录后复制

   

    private Account bean = null;
登录后复制

   

    <br>
登录后复制
登录后复制
登录后复制

   

    @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);
登录后复制

   

        <br>
登录后复制

   

        try {
登录后复制
登录后复制

   

            factory = BindingDirectory.getFactory(Account.class);
登录后复制

   

        } catch (JiBXException e) {
登录后复制

   

            e.printStackTrace();
登录后复制
登录后复制

   

        }
登录后复制
登录后复制

   

    }
登录后复制

   

    <br>
登录后复制
登录后复制
登录后复制

   

    @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();
登录后复制

   

    }
登录后复制
登录后复制
登录后复制

   

    <br>
登录后复制
登录后复制
登录后复制

   

    public void fail(Object o) {
登录后复制

   

        System.out.println(o);
登录后复制

   

    }
登录后复制
登录后复制
登录后复制

   

    <br>
登录后复制
登录后复制
登录后复制

   

    public void failRed(Object o) {
登录后复制

   

        System.err.println(o);
登录后复制

   

    }
登录后复制
登录后复制
登录后复制

   

}
登录后复制


IBindingFactory是一个工厂接口,通过BindingDirectory的getFactory工厂方法可以获得某个对象。然后通过这个工程可以获得转换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;
   
    }
   
}
登录后复制


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);
登录后复制
登录后复制

        <br/>
登录后复制
登录后复制
登录后复制
登录后复制

        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是绑定文件的名称

运行后,有如下结果:

clip_image004

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

结果如下:

clip_image006

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);
登录后复制

        <br/>
登录后复制
登录后复制
登录后复制
登录后复制

        list.add(bean);
登录后复制

        listBean.setList(list);
登录后复制

        <br/>
登录后复制
登录后复制

        <br/>
登录后复制
登录后复制
登录后复制
登录后复制

        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);
登录后复制
登录后复制

        <br/>
登录后复制
登录后复制
登录后复制
登录后复制

        reader = new StringReader(writer.toString());
登录后复制
登录后复制

        //unmarshal 解组
登录后复制
登录后复制

        IUnmarshallingContext uctx = factory.createUnmarshallingContext();
登录后复制
登录后复制

        listBean = (ListBean) uctx.unmarshalDocument(reader, null);
登录后复制

        <br/>
登录后复制
登录后复制

        fail(listBean.getList().get(0));
登录后复制

        fail(listBean.getList().get(1));
登录后复制

    } catch (Exception e) {
登录后复制
登录后复制

        e.printStackTrace();
登录后复制
登录后复制

    }
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

}
登录后复制
登录后复制
登录后复制


b) ListBean代码



package com.hoo.entity;
登录后复制
登录后复制
登录后复制

 <br/>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

import java.util.List;
登录后复制

 <br/>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

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

输出:

clip_image008

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

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

clip_image010

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;
登录后复制
登录后复制
登录后复制

 <br/>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

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

clip_image012

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;
登录后复制
登录后复制
登录后复制

 <br/>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

import java.util.HashMap;
登录后复制

 <br/>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

public class MapBean {
登录后复制

    private HashMapmap;
登录后复制

    <br/>
登录后复制

    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.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;
   
    }
   
}
登录后复制


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 顶
登录后复制

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












本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

能否用PowerPoint打开XML文件 能否用PowerPoint打开XML文件 Feb 19, 2024 pm 09:06 PM

XML文件可以用PPT打开吗?XML,即可扩展标记语言(ExtensibleMarkupLanguage),是一种被广泛应用于数据交换和数据存储的通用标记语言。与HTML相比,XML更加灵活,能够定义自己的标签和数据结构,使得数据的存储和交换更加方便和统一。而PPT,即PowerPoint,是微软公司开发的一种用于创建演示文稿的软件。它提供了图文并茂的方

使用Python实现XML数据的合并和去重 使用Python实现XML数据的合并和去重 Aug 07, 2023 am 11:33 AM

使用Python实现XML数据的合并和去重XML(eXtensibleMarkupLanguage)是一种用于存储和传输数据的标记语言。在处理XML数据时,有时候我们需要将多个XML文件合并成一个,或者去除重复的数据。本文将介绍如何使用Python实现XML数据的合并和去重的方法,并给出相应的代码示例。一、XML数据合并当我们有多个XML文件,需要将其合

使用Python实现XML数据的筛选和排序 使用Python实现XML数据的筛选和排序 Aug 07, 2023 pm 04:17 PM

使用Python实现XML数据的筛选和排序引言:XML是一种常用的数据交换格式,它以标签和属性的形式存储数据。在处理XML数据时,我们经常需要对数据进行筛选和排序。Python提供了许多有用的工具和库来处理XML数据,本文将介绍如何使用Python实现XML数据的筛选和排序。读取XML文件在开始之前,我们需要先读取XML文件。Python有许多XML处理库,

Python中的XML数据转换为CSV格式 Python中的XML数据转换为CSV格式 Aug 11, 2023 pm 07:41 PM

Python中的XML数据转换为CSV格式XML(ExtensibleMarkupLanguage)是一种可扩展标记语言,常用于数据的存储和传输。而CSV(CommaSeparatedValues)则是一种以逗号分隔的文本文件格式,常用于数据的导入和导出。在处理数据时,有时需要将XML数据转换为CSV格式以便于分析和处理。Python作为一种功能强大

使用PHP将XML数据导入数据库 使用PHP将XML数据导入数据库 Aug 07, 2023 am 09:58 AM

使用PHP将XML数据导入数据库引言:在开发中,我们经常需要将外部数据导入到数据库中进行进一步的处理和分析。而XML作为一种常用的数据交换格式,也经常被用来存储和传输结构化数据。本文将介绍如何使用PHP将XML数据导入数据库。步骤一:解析XML文件首先,我们需要解析XML文件,提取出需要的数据。PHP提供了几种解析XML的方式,其中最常用的是使用Simple

Python实现XML和JSON之间的转换 Python实现XML和JSON之间的转换 Aug 07, 2023 pm 07:10 PM

Python实现XML和JSON之间的转换导语:在日常的开发过程中,我们常常需要将数据在不同的格式之间进行转换。XML和JSON是常见的数据交换格式,在Python中,我们可以使用各种库来实现XML和JSON之间的相互转换。本文将介绍几种常用的方法,并附带代码示例。一、XML转JSON在Python中,我们可以使用xml.etree.ElementTree模

使用Python处理XML中的错误和异常 使用Python处理XML中的错误和异常 Aug 08, 2023 pm 12:25 PM

使用Python处理XML中的错误和异常XML是一种常用的数据格式,用于存储和表示结构化的数据。当我们使用Python处理XML时,有时可能会遇到一些错误和异常。在本篇文章中,我将介绍如何使用Python来处理XML中的错误和异常,并提供一些示例代码供参考。使用try-except语句捕获XML解析错误当我们使用Python解析XML时,有时候可能会遇到一些

Python解析XML中的特殊字符和转义序列 Python解析XML中的特殊字符和转义序列 Aug 08, 2023 pm 12:46 PM

Python解析XML中的特殊字符和转义序列XML(eXtensibleMarkupLanguage)是一种常用的数据交换格式,用于在不同系统之间传输和存储数据。在处理XML文件时,经常会遇到包含特殊字符和转义序列的情况,这可能会导致解析错误或者误解数据。因此,在使用Python解析XML文件时,我们需要了解如何处理这些特殊字符和转义序列。一、特殊字符和

See all articles