用XStream读取XML解析成javabean
2012-12-18 17:07
337 查看
今天要解析一个xml文件,想起很久以前看到过用xstream相互转换mxl 和 javabean很方便,就上网查了下,不过在解析的时候碰到了两个问题,现在想记录下来,方便自己以后使用,也能帮助碰到同样问题的同学们。
参考文章:
Xstream用法总结
xStream完美转换XML、JSON
xStream完美转换XML、JSON
xStream的jar下载地址:
下载
官方的示例很全,官方参考示例
打开
我为了省事,把所有jar都加到buildpath里
当我按搜到文章解析mxl时碰见了一下两个问题:
首先:对象中包含List,解析报错,如何解析
查了很多文章,demo都很简单,没有关于包含list的例子
找了很久才找到个例子
要先对包含有集合的那个对象声明一下
如下:
xstream.addImplicitCollection(Root.class, "parentList");
解析的时候它就知道这个属性是一个集合了
因为我的xml里的值都是属性值,当解析后发现所有的值都是null,全都没有映射上
我又开始搜索,搜出很多同样的一片文章,里面说到自己写一个converter类,把属性值一个一个映射到对应的类属性上,想了想这还不类死啊
还好有一个文章下面有评论,里面将到只要先前声明一下就可以了,试了下,真的可以了,所有的值都正确解析出来了
如下
xstream.useAttributeFor("subruleid", String.class);
下面就是我测试类和解析的xml
参考文章:
Xstream用法总结
xStream完美转换XML、JSON
xStream完美转换XML、JSON
xStream的jar下载地址:
下载
官方的示例很全,官方参考示例
打开
我为了省事,把所有jar都加到buildpath里
当我按搜到文章解析mxl时碰见了一下两个问题:
首先:对象中包含List,解析报错,如何解析
查了很多文章,demo都很简单,没有关于包含list的例子
找了很久才找到个例子
要先对包含有集合的那个对象声明一下
如下:
xstream.addImplicitCollection(Root.class, "parentList");
解析的时候它就知道这个属性是一个集合了
因为我的xml里的值都是属性值,当解析后发现所有的值都是null,全都没有映射上
我又开始搜索,搜出很多同样的一片文章,里面说到自己写一个converter类,把属性值一个一个映射到对应的类属性上,想了想这还不类死啊
还好有一个文章下面有评论,里面将到只要先前声明一下就可以了,试了下,真的可以了,所有的值都正确解析出来了
如下
xstream.useAttributeFor("subruleid", String.class);
下面就是我测试类和解析的xml
public class Root { private List<Parent> parentList = new ArrayList<Parent>(); 省略getter和setter }
public class Parent { private String id; private String comgroup; private String currency; private String exchange; private String stampduty; List<Child> childList = new ArrayList<Child>(); 省略getter和setter }
public class Child { private String subruleid; private String v5label; 省略getter和setter }
public class XstreamDemo { public static void main(String args[]) { XStream xstream = new XStream(new DomDriver()); xstream.alias("root", Root.class); xstream.alias("rule", Parent.class); xstream.useAttributeFor("id", String.class); xstream.useAttributeFor("comgroup", String.class); xstream.useAttributeFor("currency", String.class); xstream.useAttributeFor("exchange", String.class); xstream.useAttributeFor("stampduty", String.class); xstream.addImplicitCollection(Root.class, "parentList"); xstream.alias("subrule", Child.class); xstream.useAttributeFor("subruleid", String.class); xstream.useAttributeFor("v5label", String.class); xstream.addImplicitCollection(Parent.class, "childList"); try { InputStream in = new FileInputStream(new File("c:/temp/rules.xml")); Root root = (Root) xstream.fromXML(in); } catch (Exception e) { e.printStackTrace(); } } }
<root> <rule id="1712" comgroup="T30" currency="USD" exchange="SETS" stampduty="IE"> <subrule subruleid="1410" v5label="label" /> <subrule subruleid="1411" v5label="label11" /> <subrule subruleid="1711" v5label="Stamp duty (IE)" /> </rule> <rule id="849" comgroup="C15" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="846" v5label="label" /> <subrule subruleid="847" v5label="S50US1" /> </rule> <rule id="776" comgroup="EXP" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="773" v5label="label2" /> <subrule subruleid="774" v5label="S50US1" /> </rule> <rule id="1008" comgroup="S00" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="1005" v5label="label3" /> <subrule subruleid="1006" v5label="S00US1" /> </rule> <rule id="703" comgroup="S10" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="700" v5label="4" /> <subrule subruleid="701" v5label="S50US1" /> </rule> <rule id="630" comgroup="S15" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="627" v5label="5" /> <subrule subruleid="628" v5label="S50US1" /> </rule> <rule id="557" comgroup="S18" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="554" v5label="label6" /> <subrule subruleid="555" v5label="S50US1" /> </rule> <rule id="484" comgroup="S20" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="481" v5label="label7" /> <subrule subruleid="482" v5label="S50US1" /> </rule> <rule id="411" comgroup="S25" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="408" v5label="label8" /> <subrule subruleid="409" v5label="S50US1" /> </rule> <rule id="338" comgroup="S30" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="335" v5label="label9" /> <subrule subruleid="336" v5label="S50US1" /> </rule> <rule id="265" comgroup="SPC" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="262" v5label="labellabel10" /> <subrule subruleid="263" v5label="S50US1" /> </rule> <rule id="935" comgroup="T30" currency="USD" exchange="NYSE" stampduty="n"> <subrule subruleid="932" v5label="label11" /> <subrule subruleid="933" v5label="P01US1" /> </rule> </root>
相关文章推荐
- Android 用 XStream 将复杂xml解析为javabean
- Java用jdom.jar解析读取XML文件信息
- xstream 解析xml时只取想要的数据到bean
- dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)
- 【Java解析XML】【五】XStream简介
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- Java 利用Xstream注解生成和解析xml
- java xstream中的xml转对象时解析有属性和值的问题
- java dom4j解析XML读取数据源配置的代码实例
- java使用Xstream注解 解析xml文件 并将数据导入MySql数据库中
- java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作
- java读取xml获得list并通过反射赋值给javabean
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
- java 利用Xstream注解生成和解析xml
- Java眼中的XML--文件读取--2 应用SAX方式解析XML
- java解析xml文件读取本地dtd或者忽略dtd
- JAVA读取XML练习,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析,SAX (Simple API for XML)
- java生成解析xml的另外两种方法Xstream
- Java 读取ClassPathXmlApplicationContext xml 文件里面的bean