JiBX1.2 处理XML

内容概要:本博文将讲解在jibX下处理XML文件。涉及到如何把Java bean文件生成相应的binding.xml和xml schema文件、如何根据binding.xml文件进行jibX编译以及简单测试。

思路:由java二进制class文件A生成xml的连接文件B--》 根据连接文件B和原始的二进制文件A编译得到二进制clas文件A2。A2就是我们的目标。

操作环境:linux

jibX版本:2.1.6

辅助工具:Intelij IDEA或者Eclipse


1、安装jibx。

只需要下载安装包,解压到某一目录即可。本人的目录是:/home/liangyh//Music/jibx


2、Java bean代码

https://github.com/liangyihuai/Netty4.0Learn/tree/master/src/com/huai/netty/jibx/pojo


3、生成binding.xml和xml schema文件

注意,在这一步中,我们操作的是java 编译后的class二进制文件,不是java文本文件。如何得到java的二进制文件呢?可以使用Intelij IDEA 或者Eclipse生成。当然,还有其他的办法。

(1)、把class文件所在的src文件夹复制到jibx所安装的目录。


(2)、进入src目录,在命令行中输入下面命令,我们会看到新增加了两个文件binding.xml和projo.xsd,前一个是java pojo和xml的连接文件,后一个是bind.xml的xml的描述文件(xml schema),在下一步中,我们需要使用bind.xml文件进行编译:

java -cp ../lib/jibx-tools.jar:bin org.jibx.binding.generator.BindGen -s src com.huai.netty.jibx.pojo.Order



命令解释:

1、-cp:指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”

分隔,linux上是分号“:”分隔。不支持通配符,需要列出所有jar包,用一点“.”代表当前路径。
现在我们所依赖的是jibx-tools.jar包, 其中org.jibx.binding.generator.BindGen是该java包中的一个类。
2、-s 表示源文件所在路径,也是我们命令行窗口中所在的目录。
3、最后的是我们class二进制文件的包名。


4、jibx编译:同样是在src目录下,输入:

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

jibX编译的作用是根据连接文件和pojo对象的映射关系和规则动态修改pojo类。

需要注意的是,-v binding.xml指定了上一步所生成的连接文件。下图显示,编译之后,新生成了三个jibX_binding***.class文件

到了这一步,我们就可以不再使用我们的xml文件了。接下来我们就可以使用这些class文件测试了。所以,我们需要把它们放到适当的地方,比如,笔者使用的是Intelij IDEA,笔者把它们复制到了IDEA编译项目所在的目录,这样我就可以直接使用IDEA编写测试程序和运行它们。(可以有其他方法,总之能够使用这些class文件就可以了。)



5、测试

(1)、测试代码

/**
 * Created by liangyh on 5/27/16.
 */
public class Test {

    private IBindingFactory factory = null;
    private StringWriter writer = null;
    private StringReader reader = null;
    private final static String CHARSET_NAME = "utf-8";

    private String encode2Xml(Order order) throws jibXException,IOException {
        factory = BindingDirectory.getFactory(Order.class);
        writer = new StringWriter();
        IMarshallingContext mctx = factory.createMarshallingContext();
        mctx.setIndent(2);
        mctx.marshalDocument(order,CHARSET_NAME,null,writer);
        String xmlStr = writer.toString();
        writer.close();
        System.out.println(xmlStr.toString());

        return xmlStr;
    }

    private Order decode2Order(String xmlBody) throws jibXException {
        reader = new StringReader(xmlBody);
        IUnmarshallingContext uctx = factory.createUnmarshallingContext();
        Order order = (Order)uctx.unmarshalDocument(reader);
        return order;
    }

    public static void main(String[] args) throws IOException,jibXException {

        Test test = new test();
        Order order = new Order();

        Customer customer = new Customer();
        customer.setCustomerNumber(424);
        customer.setFirstName("namedfasFirst");
        customer.setLastName("namefsdfLast");
        List<String> names = new ArrayList<>(3);
        names.add("name1");
        names.add("name2");
        names.add("name3");
        customer.setMiddleNames(names);
        order.setCustomer(customer);

        Address address = new Address();
        address.setCity("GuangDong");
        address.setPostCode("232kdfd");
        order.setBillTo(address);

        order.setRoderNumber(1214);

        order.setShipping(Shipping.DOMESTIC_EXPRESS);

        String body = test.encode2Xml(order);
        Order order1 = test.decode2Order(body);
        System.out.println(order1);

    }
}

运行结果:




参考资料:

http://www.cnblogs.com/hoojo/archive/2011/04/27/2030205.html

https://en.wikipedia.org/wiki/JiBX

http://www.ibm.com/developerworks/java/tutorials/j-jibx1/

http://jibx.sourceforge.net/fromcode/index.html

http://blog.163.com/sparkle_tiangz/blog/static/117590203201110944557436/?COLLCC=656382236&

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念