用XStream读取XML解析成javabean

今天要解析一个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


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>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值