xstream把xml转成javabean,如何解析部分xml节点?

lanytin 2014-01-22 05:33:05
加精
由于xml结构较复杂,而且我现在有很多节点不需要解析。
我现在是每个节点一个bean,要不然fromXML()的时候,就会报错。
请问,有没有方法,使xstream解析的时候,跳过某些节点?
请告诉代码详示。
...全文
11654 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aki009 2016-02-15
  • 打赏
  • 举报
回复
使用这两个函数,告诉XStream要忽略掉未知的XML要素 ignoreUnknownElements(); ignoreUnknownElements(String pattern); XStream老版本可能没有这个函数
daker_129 2016-01-22
  • 打赏
  • 举报
回复
selectsinglenode
Page-hy 2016-01-20
  • 打赏
  • 举报
回复
不懂 不懂 不懂
纯粹码农 2016-01-14
  • 打赏
  • 举报
回复
经济快速看书zzzz
省身 2016-01-13
  • 打赏
  • 举报
回复
感谢楼主,可行
arlen43 2015-01-19
  • 打赏
  • 举报
回复
引用 12 楼 lw_lndl 的回复:
可以扩展XStream类,处理时可以判断哪些节点处理,哪些节点掠过去。 public class ETLXstream extends XStream { /* * (non-Javadoc) * * @see * com.thoughtworks.xstream.XStream#wrapMapper */ @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { /* * (non-Javadoc) * * @see * com.thoughtworks.xstream.mapper.MapperWrapper#shouldSerializeMember */ @Override public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) { // 不能识别的节点,掠过。 if (definedIn == Object.class) { return false; } // 节点名称为fileName的掠过 if (fieldName.equals("fileName")) { return false; } return super.shouldSerializeMember(definedIn, fieldName); } }; } }
感谢,困惑很久了
arlen43 2015-01-19
  • 打赏
  • 举报
回复
引用 5 楼 fangmingshijie 的回复:
import com.thoughtworks.xstream.annotations.XStreamOmitField;

public class Test {
	private String name;

	@XStreamOmitField
	private String hidden;

	public Test(String name, String hidden) {
		this.name = name;
		this.hidden = hidden;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getHidden() {
		return hidden;
	}

	public void setHidden(String hidden) {
		this.hidden = hidden;
	}

}


public static void main(String[] args) throws IOException {
		XStream xs = new XStream();
		// xs.processAnnotations(Test.class);
		xs.autodetectAnnotations(true);
		String str = xs.toXML(new Test("dddd", "dd"));
		System.out.println(str);

	}

我这里毫无压力啊,上面两种你都试下。
大哥,回答问题时,都看看清楚题目啊!!!由javaBean到xml这么小儿科的问题,楼主不会自己去官网看帮助文档么???
lanytin 2014-01-23
  • 打赏
  • 举报
回复
引用 8 楼 fangmingshijie 的回复:
xstream好像提供隐含集合处理方 式的,叫什么addimplicitcollect之类的,不太记得了,你自己搜下吧,既然能正向过滤,肯定也可以反向过滤的。
addimplicitcollect是集合的处理方式,单个节点的处理方式,应该不行。整了一晚上,终于被我找到了。 两种方式,1:override wrapMapper;2:x.omitField(A.class, "shouldCopyWithProject"); 具体说明,请点击这里 希望以后遇到相同问题的同学们,能看到这个帖子。
玮G 2014-01-23
  • 打赏
  • 举报
回复
可以扩展XStream类,处理时可以判断哪些节点处理,哪些节点掠过去。 public class ETLXstream extends XStream { /* * (non-Javadoc) * * @see * com.thoughtworks.xstream.XStream#wrapMapper */ @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { /* * (non-Javadoc) * * @see * com.thoughtworks.xstream.mapper.MapperWrapper#shouldSerializeMember */ @Override public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) { // 不能识别的节点,掠过。 if (definedIn == Object.class) { return false; } // 节点名称为fileName的掠过 if (fieldName.equals("fileName")) { return false; } return super.shouldSerializeMember(definedIn, fieldName); } }; } }
  • 打赏
  • 举报
回复
测试成功了?
tony4geek 2014-01-23
  • 打赏
  • 举报
回复
厉害哦,找到了
  • 打赏
  • 举报
回复
xstream好像提供隐含集合处理方 式的,叫什么addimplicitcollect之类的,不太记得了,你自己搜下吧,既然能正向过滤,肯定也可以反向过滤的。
lanytin 2014-01-22
  • 打赏
  • 举报
回复
@XStreamOmitField,在stack overflow上面看的一些例子,或者官方,都是javabean转xml时使用。 我现在应用的场景刚好相反,是把xml转javabean.
lanytin 2014-01-22
  • 打赏
  • 举报
回复
fangmingshijie,你可能没有理解我意思问题。 我的问题是,正常的话,xstream把xml解析成javabean时,xml文档每个节点,都要创建一个对应的javabean,并使用@XStreamAlias。但现在xml文档结构比较复杂,每个节点都创建一个对应的javabean时,工作量很大,而且中间很多节点,我取数据根本就不需要。我通过什么方法,控制xstream解析我使用的文档节点。就想jdom使用xpath一样
  • 打赏
  • 举报
回复
import com.thoughtworks.xstream.annotations.XStreamOmitField;

public class Test {
	private String name;

	@XStreamOmitField
	private String hidden;

	public Test(String name, String hidden) {
		this.name = name;
		this.hidden = hidden;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getHidden() {
		return hidden;
	}

	public void setHidden(String hidden) {
		this.hidden = hidden;
	}

}


public static void main(String[] args) throws IOException {
		XStream xs = new XStream();
		// xs.processAnnotations(Test.class);
		xs.autodetectAnnotations(true);
		String str = xs.toXML(new Test("dddd", "dd"));
		System.out.println(str);

	}

我这里毫无压力啊,上面两种你都试下。
lanytin 2014-01-22
  • 打赏
  • 举报
回复
fangmingshijie,版主求救啊
lanytin 2014-01-22
  • 打赏
  • 举报
回复
我是xml转成javabean,而且也有
xStream.autodetectAnnotations(true);
lanytin 2014-01-22
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
@XStreamOmitField 当然用这个注解了。
试了一下,不行啊。
	@XStreamAlias("HEAD")
	private HEAD head;
	@XStreamOmitField
	private MSG msg;
测试之后,有异常如下:
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field com.ibank.monitor.padomain.CFX.MSG
---- Debugging information ----
field               : MSG
class               : com.ibank.monitor.padomain.CFX
required-type       : com.ibank.monitor.padomain.CFX
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /CFX/MSG
version             : 1.4.6
  • 打赏
  • 举报
回复
@XStreamOmitField 当然用这个注解了。
基于Java的XML解析与反射设计模式 摘要:随着计算机时代的蓬勃发展,internet的普及给社会以及人民的生活带来了巨 大的影响。与此同时,b/s结构的多系统相互访问技术应时代的发展也如雨后春笋般不断 涌现出来,相应的多系统间数据交互产生的问题也是越来越多,xml的数据解析与系统业 务逻辑如何融合就是其中比较难以解决的问题之一。 关键词:xml java 在web中,多系统间数据交互一般使用webservice技术,它是一种构建应用程序的普遍模 型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支, 是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。webservice是一个 应用组件,它逻辑性的为其他应用程序提供数据与服务。各应用程序通过网络协议和规 定的一些标准数据格式(http,xml,soap)来访问webservice,通过webservice内部执 行得到所需结果。web service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他webse rvice应用程序可以发现并调用它部署的服务。webservice的主要目标就是跨平台的可互 操作性。为了达到这一目标,webservice完全基于xml、xsd等独立于平台、独立于软件 供应商的标准,是创建可互操作的、分布式应用程序的新平台。 java作为现下最流行的可撰写的跨平台应用软件的面向对象的程序设计语言,在多系统 数据交互这方面具有先天的优势。它具有动态性,它的设计目标之一是适应于动态变化 的环境。java程序需要的类能够动态的被载入到运行环境,也可以通过网络来载入所需 要的类。安全性,java通常被用在网络环境宏,为此,java提供了一个安全机制加以防 恶意代码的攻击。除了java语言具有的许多安全特性以外,java对通过网络下载的类具 有一个安全防范机制(类classloader),如分配不同的名字空间以防替代本地的同名类 、字节代码检查,并提供安全管理机制(类securitymanager)让java应用设置安全哨兵 。多元性,作为现下最流行的语言,应用之广泛,资源之充足都是现今流行语言中的佼 佼者,在行业和企业信息化、电子政务及办公自动化、嵌入式设备及消费类电子产品、 辅助教学等领域发挥着其多元性的优势。 xstream可以完美转换xml,与以往的解析xml工具dom相比,xstream是一个易用的、开源 的库,使用起来简单、小巧,容易理解,可以轻易的将java对象和xml文档相互转换,而 且可以修改某个特定的属性和节点名称。就是由于与java对象的完美转换才更贴近于面 向对象的设计思想,让开发人员更易于使用,更易于过度解析xml与项目业务逻辑之间的 联系。xstream不仅对xml的转换非常友好,而且提供annotation注解,可以在avabean中 完成对xml节点、属性的描述。以及对json也支持,只需要提供相关的jsondriver就可以 完成转换。使用xstream序列化的类不需要实现serializable接口。xstream是一种序列 化工具而不是数据绑定工具,就是说不能从xml或者xml schema definition (xsd)文件生成类。 和其他序列化工具相比,xstream 有三个突出的特点: xstream不关心序列化/逆序列化的类的字段的可见性。 序列化/逆 序列化类的字段不需要getter和setter 方法。 序列化/逆序列化的类不需要有默认构造函数。 不需要修改类,使用 xstream就能直接序列化/逆序列化任何第三方类。xstream也有其欠缺的地方,当xml过 大时用xstream解析就略显笨重,saxparser可以解决这个问题,saxparser在处理xml时 非常类似于流媒体的方式,分析能够立刻开始,而不是等待所有的数据被处理。而且程 序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于处理大型xml来 说是个巨大的优点,事实上,程序甚至不必解析整个文档,它可以在某个条件得到满足 时停止解析,这种读取方式比xstream与dom都要快上许多。所以在读取大型xml时可以把 xstream与saxparser结合起来使用,用saxparser读取整个xml把核心数据部分让xstrea m来解析javabean,这样既解决了大数据的问题又利用了xstream快速转化javabean的 优点。 为了利于多系统间数据交互的一致性与标准性,需要在开发项目初期就要制定好数据交 互的xsd标准( xml schemas definition )。xsd描述了xml文档的结构。可以用一个指定的xsd来验证某个xml文档,以检查该xm l文档是否符合其要

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧