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/

Jar下載:http://www.php.cn/

c) 依賴jar包如下:

Jibx 處理XML

2、程式準備程式碼


ee

   
package com.hoo.test;
登入後複製

   
 <br>
登入後複製
登入後複製

   
import java.io.IOException;
登入後複製

   
import java.io.StringReader;
登入後複製

 ee

   

import java.io.StringWriter;
登入後複製

   

import java.util.ArrayList;
登入後複製

   

import java.util.HashMap;
登入後複製

   

rrrer
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
登入後複製

 ee

   

 * @author hoojo
登入後複製

   

 * @createDate 2011-4-25 下午06:47:33
登入後複製

   

 * @file JibxTest.java
登入後複製

   

rrrer
 * @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();
登入後複製

 ee

   

        bean.setAddress("北京");
登入後複製

   

        bean.setEmail("email");
登入後複製

   

        bean.setId(1);
登入後複製

   

rrrer
        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) {
登入後複製

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

运行后,有如下结果:

Jibx 處理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
登入後複製


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

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

结果如下:

Jibx 處理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
登入後複製
登入後複製

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

输出:

Jibx 處理XML

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

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

Jibx 處理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;
登入後複製
登入後複製
登入後複製

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

Jibx 處理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"?>
登入後複製
登入後複製
登入後複製
登入後複製

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