`
yuanlanjun
  • 浏览: 1184306 次
文章分类
社区版块
存档分类
最新评论

使用XStream解析复杂的XML文件

 
阅读更多

未经允许不得转载,如想转载请先联系作者,并注明来源:http://blog.csdn.net/faye0412/article/details/6602144

XStream在实现Java、xml之间转换非常的出色。但是有时候一些比较复杂的XML文件就不好下手,在此以如下XML为例演示了XML to Object,Object to XML的过程。

依赖包:
xstream-1.3.1.jar
xpp3_min-1.1.4c.jar

XML文件:
<IR>
<UserDetails>
<UID>guest</UID>
<UType>JLJE89dd8DasGds6es</UType>
<UToken>DG8kxksEo903kdm8e2j4Kds8d</UToken>
</UserDetails>
<MainContext>
<CID>ctx000001</CID>
<Banner>
<RepName>repname</RepName>
</Banner>
<GuidedFlows>
<GFContext GFType="nav">
<GFCID>gf0001</GFCID>
<GFRep>
<RepName>test</RepName>
</GFRep>
<Method Action="method">http://fdsf....</Method>
<Parameters>
<Param>
<Location>location</Location>
<ValidateMethod>validate method</ValidateMethod>
</Param>
</Parameters>
</GFContext>
<GFContext GFType="nav">
<GFCID>gf0002</GFCID>
<GFRep>
<RepName>test2</RepName>
</GFRep>
<Method Action="method2">http://fdsf....</Method>
<Parameters>
<Param>
<Location>location2</Location>
<ValidateMethod>validate method2</ValidateMethod>
</Param>
</Parameters>
</GFContext>
<GFContext GFType="nav">
<GFCID>gf0003</GFCID>
<GFRep>
<RepName>test3</RepName>
</GFRep>
<Method Action="method3">http://fdsf....</Method>
<Parameters>
<Param>
<Location>location3</Location>
<ValidateMethod>validate method3</ValidateMethod>
</Param>
</Parameters>
</GFContext>
</GuidedFlows>
</MainContext>
</IR>


定义实体类:

UserDetails:


public class UserDetails {

private String UID;
private String UType;
private String UToken;

public UserDetails(String UID, String UType, String uToken) {
this.UID = UID;
this.UType = UType;
this.UToken = uToken;
}

public String getUID() {
return UID;
}

public void setUID(String uID) {
UID = uID;
}

public String getUType() {
return UType;
}

public void setUType(String uType) {
UType = uType;
}

public String getUToken() {
return UToken;
}

public void setUToken(String uToken) {
UToken = uToken;
}

@Override
public String toString() {
return "UserDetails [UID=" + UID + ", UType=" + UType + ", UToken="
+ UToken + "]";
}
}


MainContext:

import java.util.ArrayList;
import java.util.List;

public class MainContext {

private String CID;
private Banner Banner;
private List<GFContext> GFContext = new ArrayList<GFContext>();

public MainContext(String CID, Banner Banner, List<GFContext> GFContext) {
this.CID = CID;
this.Banner = Banner;
this.GFContext = GFContext;
}

public String getCID() {
return CID;
}

public void setCID(String cID) {
CID = cID;
}

public Banner getBanner() {
return Banner;
}

public void setBanner(Banner banner) {
Banner = banner;
}

public List<GFContext> getGFContext() {
return GFContext;
}

public void setGFContext(List<GFContext> gFContext) {
GFContext = gFContext;
}

@Override
public String toString() {
return "MainContext [CID=" + CID + ", Banner=" + Banner
+ ", GuidedFlows=" + GFContext + "]";
}
}


Banner:

public class Banner {

private String RepName;

public Banner(String RepName){
this.RepName = RepName;
}

public String getRepName() {
return RepName;
}

public void setRepName(String repName) {
RepName = repName;
}

@Override
public String toString() {
return "Banner [RepName=" + RepName + "]";
}
}


GFContext:

public class GFContext {

private String GFType;
private String GFCID;
private GFRep GFRep;
private Method Method;
private Parameters Parameters;

public GFContext(String GFType, String GFCID, GFRep GFRep, Method Method, Parameters Parameters){
this.GFType = GFType;
this.GFCID = GFCID;
this.GFRep = GFRep;
this.Method = Method;
this.Parameters = Parameters;
}

public String getGFType() {
return GFType;
}

public void setGFType(String gFType) {
this.GFType = gFType;
}

public String getGFCID() {
return GFCID;
}

public void setGFCID(String gFCID) {
this.GFCID = gFCID;
}

public GFRep getGFRep() {
return GFRep;
}

public void setGFRep(GFRep gFRep) {
this.GFRep = gFRep;
}

public Method getMethod() {
return Method;
}

public void setMethod(Method Method) {
this.Method = Method;
}

public Parameters getParameters() {
return Parameters;
}

public void setParameters(Parameters parameters) {
this.Parameters = parameters;
}

@Override
public String toString() {
return "GFContext [GFType=" + GFType + ", GFCID=" + GFCID + ", GFRep="
+ GFRep + ", Method=" + Method + ", Parameters=" + Parameters
+ "]";
}

}


GFRep:

public class GFRep {

private String RepName;
private String RepURL;

public GFRep(String RepName) {
this.RepName = RepName;
}

public GFRep(String RepName, String RepURL) {
this.RepName = RepName;
this.RepURL = RepURL;
}

public String getRepName() {
return RepName;
}

public void setRepName(String repName) {
RepName = repName;
}

public String getRepURL() {
return RepURL;
}

public void setRepURL(String repURL) {
RepURL = repURL;
}

@Override
public String toString() {
return "GFRep [RepName=" + RepName + ", RepURL=" + RepURL + "]";
}

}

Method:

public class Method {

private String Action;
private String value;

public Method(){
}

public Method(String value){
this.value = value;
}

public Method(String Action, String value){
this.Action = Action;
this.value = value;
}

public String getAction() {
return Action;
}

public void setAction(String action) {
Action = action;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}

@Override
public String toString() {
return "Method [Action=" + Action + ", value=" + value + "]";
}

}

Parameters:

public class Parameters {

private Param Param;

public Parameters(Param Param) {
this.Param = Param;
}

public Param getParam() {
return Param;
}

public void setParam(Param param) {
Param = param;
}

@Override
public String toString() {
return "Parameters [Param=" + Param + "]";
}
}

Param:

public class Param {

private String Location;
private String ValidateMethod;

public Param(String Location) {
this.Location = Location;
}

public Param(String Location, String ValidateMethod) {
this.Location = Location;
this.ValidateMethod = ValidateMethod;
}

public String getLocation() {
return Location;
}

public void setLocation(String location) {
Location = location;
}

public String getValidateMethod() {
return ValidateMethod;
}

public void setValidateMethod(String validateMethod) {
ValidateMethod = validateMethod;
}

@Override
public String toString() {
return "Param [location=" + Location + ", validateMethod="
+ ValidateMethod + "]";
}
}

由于我们需要实现类似:<field name="value">I am a Field.</Method>这样的效果。因此,我们需要实现一个Converter。这个很关键,也是我试了好久才解决的问题,在此也分享一下:

MethodConverter.java:

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class MethodConverter implements Converter {

public boolean canConvert(Class clazz) {
return clazz.equals(Method.class);
}

public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Method method = (Method)value;
if (method!=null) {
writer.addAttribute("Action", method.getAction());
writer.setValue(method.getValue());
}

}

@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Method method = new Method();
String action = reader.getAttribute("Action");
method.setAction(action);
System.out.println(">>> Action: "+action);
String value = reader.getValue();
System.out.println(">>> method: "+value+", NodeName: "+reader.getNodeName());
method.setValue(value);

return method;

}
}


测试代码:

1. Object生成XML

xStreanTest.java


import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;

public class xStreanTest {

/**
* @param args
*/
public static void main(String[] args) {

GFRep gfrep = new GFRep("test");

Param param = new Param("location","validate method");

Parameters p = new Parameters(param);

List<GFContext> ls = new ArrayList<GFContext>();
GFContext gfcontext = new GFContext("nav", "gf0001", gfrep, new Method("method","http://fdsf...."), p);
ls.add(gfcontext);

gfrep = new GFRep("test2");
param = new Param("location2","validate method2");
p = new Parameters(param);
gfcontext = new GFContext("nav", "gf0002", gfrep, new Method("method2","http://fdsf...."), p);
ls.add(gfcontext);

gfrep = new GFRep("test3");
param = new Param("location3","validate method3");
p = new Parameters(param);
gfcontext = new GFContext("nav", "gf0003", gfrep, new Method("method3","http://fdsf...."), p);
ls.add(gfcontext);



//GuidedFlows gf = new GuidedFlows(ls);

Banner banner = new Banner("repname");

MainContext mc = new MainContext("ctx000001", banner, ls);

UserDetails ud = new UserDetails("guest","JLJE89dd8DasGds6es", "starhub");

MLoginIR mir = new MLoginIR(ud, mc);

XStream xstream = new XStream();
xstream.registerConverter(new MethodConverter());
xstream.alias("IR", MLoginIR.class);
xstream.alias("UserDetails", UserDetails.class);
xstream.alias("MainContext", MainContext.class);
xstream.alias("Banner", Banner.class);
//xstream.alias("GuidedFlows", GuidedFlows.class);
xstream.alias("GFContext", GFContext.class);
xstream.alias("GFRep", GFRep.class);
xstream.alias("Parameters", Parameters.class);
xstream.alias("Param", Param.class);
//xstream.alias("RepName", RepName.class);

xstream.aliasField("GuidedFlows", MainContext.class, "GFContext");
xstream.useAttributeFor(GFContext.class, "GFType");
xstream.useAttributeFor(Method.class, "Action");
String xml = xstream.toXML(mir);
System.out.println(xml);

MLoginIR m = (MLoginIR)xstream.fromXML(xml);
System.out.println(m);
}

}

2. XML转Object

xStreanTest2.java


import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;

public class xStreanTest2 {

/**
* @param args
*/
public static void main(String[] args) {

String xml = "TODO";

XStream xstream = new XStream();
xstream.registerConverter(new MethodConverter());
xstream.alias("IR", MLoginIR.class);
xstream.alias("UserDetails", UserDetails.class);
xstream.alias("MainContext", MainContext.class);
xstream.alias("Banner", Banner.class);
xstream.alias("GFContext", GFContext.class);
xstream.alias("GFRep", GFRep.class);
xstream.alias("Parameters", Parameters.class);
xstream.alias("Param", Param.class);
//xstream.alias("RepName", RepName.class);
xstream.alias("Method", Method.class);
xstream.aliasField("GuidedFlows", MainContext.class, "GFContext");
xstream.useAttributeFor(GFContext.class, "GFType");
xstream.useAttributeFor(Method.class, "Action");
MLoginIR newIR = (MLoginIR)xstream.fromXML(xml);
System.out.println(newIR.getUserDetails());
List<GFContext> ls_gf = newIR.getMainContext().getGFContext();
Banner banner = newIR.getMainContext().getBanner();
System.out.println(banner);
for(GFContext gf : ls_gf){
System.out.println("gf:"+gf);
GFRep gfrep = gf.getGFRep();
System.out.println(gfrep);
Parameters p = gf.getParameters();
System.out.println(p);
Param p2 = p.getParam();
System.out.println(p2);
Method m = gf.getMethod();
System.out.println(m);
System.out.println("==================================");
}

}

}
分享到:
评论

相关推荐

    Xstream解析xml

    使用Xstream解析复杂xml文件,并读入MySql数据库中

    xstream方式解析xml文件

    xstream方式解析及生成xml文件

    xstream轻松解析xml到java对象

    xstream轻松解析xml到java对象,内附样例。so easy!妈妈再也不用担心我的xml解析。

    XStream XML解析

    XStream XML解析 含样例及详细嵌入文档

    使用xstream进行java类与xml文件互转解析--代码

    使用xstream进行java类与xml文件互转解析

    XStream 解析 android

    XStream 解析 可以迅速解析XML文件

    android XMl 解析神奇xstream 一

    android XMl 解析神奇xstream 一: 解析android项目中的xml文件

    xStream解析工具包

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列...

    android 使用XStream解析xml的实例

    1,要解析的xml文件文件 xml=&lt;apps&gt;\n + &lt;app&gt;\n + &lt;id&gt;1&lt;/id&gt;\n + &lt;name&gt;burn&lt;/name&gt;\n + &lt;version&gt;1.0&lt;/version&gt;\n + &lt;info&gt;\n + &lt;size&gt;10.5&lt;/size&gt;\n + &lt;message&gt;hhhhhhhh&lt;/message&gt;\n + &lt;/info&gt;\n + ...

    xStream使用demo

    使用xstream来读取xml文件的demo,该demo中,使用了支付宝对账单返回的xml为列子来展示使用xstream的注解的方式读取xml,并且转成实体类.学习xstream或者对xstream有疑问的可以参考下..之所以使用支付宝账单返回的xml是...

    xstream学习文档及实例

    xstream用于解析和生成XML文件最优方案

    java解析XML所需要的完整包(包括XStream.jar,dom4j.jar和xpull/xpp.jar)

    java转换XML的必须要的包,总共三个,分别包括XStream.jar,dom4j.jar和xpull/xpp.jar包。

    xstream 1.4.3 bin zip

    xStream1.4.3发行包,可以用xStream解析生成xml,面相对象,效率很高,可以利用转换器对付复杂xml,不过过于复杂的xml还是有解析难度,但是至今没有遇到过于复杂的xml文件

    XStream 1.3 API(CHM)

    XStream可以将xml直接转换成Java类,并且完成数据的封装,反之可以将Java类转换成xml文件.XStream可以省去了经常人为解析xml的过程。

    SAXParser-用SAX读取大于100M的xml文件(java)

    压缩包里面有两个文件:SAX.java和SAXparse.java 用来解析大于100M的xml文件,SAX读取xml不同于DOM方式,DOM方式在解析xml前需要全部加载xml文件,当xml文件很大时,就会出现内存不足的问题,而SAX则是逐行读取xml...

    基于Java的XML解析与反射设计模式.doc

    xstream可以完美转换xml,与以往的解析xml工具dom相比,xstream是一个易用的、开源 的库,使用起来简单、小巧,容易理解,可以轻易的将java对象和xml文档相互转换,而 且可以修改某个特定的属性和节点名称。...

    xstream-1.4.4-sources.jar

    XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换。将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件。

    dom4j、XStream的jar包

    dom4j用于解析xml 文档,而XStream则是将Java对象转成xml文件。使用这两个工具就很好的解决了xml文件的解析与Java对象转成xml的麻烦了!

    XStream 使用文档

    本人介绍XStream XML的高性能解析,以及高级特性

    xstream实例.rar

    利用xstream技术生成和解析XML文件的例子。同时里面包含xstream1.3.1.chm帮助文档,jar包(xstream-1.3.1.jar、jettison-1.0.1.jar、xpp3_min-1.1.4c.jar、junit.4.8.1.jar),还有sstream1.3.1源码。

Global site tag (gtag.js) - Google Analytics