内容概要:本博文将讲解在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
注意,在这一步中,我们操作的是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上分号“;”
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&