解析XML的方法

我用的是XStream框架

这个框架真是好用,完美的将java对象和xml进行了转换。

首先就是创建要解析的xml对象的框架,对每一层封装成一个对象。这里面有一个比较重要的@XStreamAlias这个属性就是别名。

xml格式如下:

@XStreamAlias("Message")
public class Message {


<span style="white-space:pre">	</span>@XStreamAlias("Header")
<span style="white-space:pre">	</span>private Header header;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>@XStreamAlias("Body")
<span style="white-space:pre">	</span>private Body body;


<span style="white-space:pre">	</span>public Header getHeader() {
<span style="white-space:pre">		</span>return header;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setHeader(Header header) {
<span style="white-space:pre">		</span>this.header = header;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public Body getBody() {
<span style="white-space:pre">		</span>return body;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setBody(Body body) {
<span style="white-space:pre">		</span>this.body = body;
<span style="white-space:pre">	</span>}
}
@XStreamAlias("Header")
public class Header {


<span style="white-space:pre">	</span>@XStreamAlias("TransactionID")
<span style="white-space:pre">	</span>private String transactionID;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public String getTransactionID() {
<span style="white-space:pre">		</span>return transactionID;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setTransactionID(String transactionID) {
<span style="white-space:pre">		</span>this.transactionID = transactionID;
<span style="white-space:pre">	</span>}

}
@XStreamAlias("Body")
public class Body {


<span style="white-space:pre">	</span>@XStreamAlias("UserInfo")
<span style="white-space:pre">	</span>private UserInfo userInfo;


<span style="white-space:pre">	</span>public UserInfo getUserInfo() {
<span style="white-space:pre">		</span>return userInfo;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setUserInfo(UserInfo userInfo) {
<span style="white-space:pre">		</span>this.userInfo = userInfo;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
}
@XStreamAlias("UserInfo")
public class UserInfo {




<span style="white-space:pre">	</span>@XStreamAlias("phonenum")
<span style="white-space:pre">	</span>private String phonenum;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>@XStreamAlias("username")
<span style="white-space:pre">	</span>private String username;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>@XStreamAlias("password")
<span style="white-space:pre">	</span>private String password;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>


<span style="white-space:pre">	</span>public String getPhonenum() {
<span style="white-space:pre">		</span>return phonenum;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setPhonenum(String phonenum) {
<span style="white-space:pre">		</span>this.phonenum = phonenum;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public String getUsername() {
<span style="white-space:pre">		</span>return username;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setUsername(String username) {
<span style="white-space:pre">		</span>this.username = username;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public String getPassword() {
<span style="white-space:pre">		</span>return password;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>public void setPassword(String password) {
<span style="white-space:pre">		</span>this.password = password;
<span style="white-space:pre">	</span>}


}

<message>

<Header>

<transactionID>123456</transactionID>

</Header>

<Body>

<userInfo phonenum="1111" username="aaa" password="1111"><userInfo/>

</Body>

</message>

这里是首先要做的工作就是对要解析的xml的封装格式的对象化。

接下来就是解析

private BroadcastData parseEpgFile(File file) {
		BroadcastData castData = null;
		String fileName = file.getName();
		InputStream inputStream = null;
		try {
			inputStream = new FileInputStream(file);
			// 用此种构造方法是为了去掉报文中下划线占两个字符的问题
			XStream xstream = new XStream(new XppDriver(
					new XmlFriendlyReplacer("-_", "_")));
			xstream.autodetectAnnotations(true);//<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px;">告诉XStream去解析JAVA bean中的annotation</span>
			xstream.processAnnotations(Message.class);
			castData = (Message) xstream.fromXML(inputStream);
			logger.info("read epg xml successful. fileName=" + fileName);
		} catch (Exception e) {
			logger.warn("error parsing epg file: " + file.getAbsolutePath(), e);
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					logger.error(
							"close inputStream ioException when in readEpgFile",
							e);
				}
			}
		}

		return castData;
	}

tream.autodetectAnnotations(true); , 这句代码的意思是告诉XStream对象需要自动识别annotation, 这在序列化(JAVA bean-->XML)的时候没什么问题。但是在反序列化的时候就有问题了,原因官网上说的比较模糊,总之就是不行,只能通过xstream.processAnnotations(Class clazz) 来显式的注册需要使用annotation的类才行,如果JAVA bean很多就会比较麻烦。但一般来说JAVA bean在代码组织结构中都比较集中,如放在听一个package下,这样也好办,可以再程序中将该package下的JAVA bean都获取,然后使用xstream.processAnnotations(Class[] clazzs) 批量注册。


如果xml含有list对象,例如:‘

<message>

<Header>

<transactionID>123456</transactionID>

</Header>

<Body>

<userInfo phonenum="1111" username="aaa" password="1111"><userInfo/>

<userInfo phonenum="1111" username="aaa" password="1111"><userInfo/>

</Body>

</message>

则使用:
@XStreamAlias("Body")
public class List {

	@XStreamImplicit(itemFieldName="<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>")
	private java.util.List<<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>> <span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>;

	public java.util.List<<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>> getProductInfo() {
		return <span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>;
	}

	public void setProductInfos(java.util.List<<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>> <span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>) {
		this.<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; font-size: 16px; line-height: 28.799999237060547px; white-space: pre;">userInfo</span>= <span style="font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif;">userInfo</span>;
	}
	  
}
@XStreamImplicit(itemFieldName=" userInfo ")这个注解就是反序列化list的

对于最里面的对象的属性值,需要注意一点就是要添加@XStreamAsAtribute这个注解,否则范序列化后,获取不到想要的属性值。

@XStreamAlias("ProductInfo")
public class ProductInfo {

	@XStreamAsAttribute
	@XStreamAlias("command")
	private String command;
	
	@XStreamAsAttribute
	@XStreamAlias("productid")
	private String productid;
	
	
	@XStreamAsAttribute
	@XStreamAlias("endtime")
	private String endtime;

	public String getCommand() {
		return command;
	}

	public void setCommand(String command) {
		this.command = command;
	}

	public String getProductid() {
		return productid;
	}

	public void setProductid(String productid) {
		this.productid = productid;
	}

	@Override
    public String toString() 
    {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    }   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值