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

lanytin 2014-01-22 05:33:05
加精
由于xml结构较复杂,而且我现在有很多节点不需要解析。
我现在是每个节点一个bean,要不然fromXML()的时候,就会报错。
请问,有没有方法,使xstream解析的时候,跳过某些节点?
请告诉代码详示。
...全文
11806 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 当然用这个注解了。

62,621

社区成员

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

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