Java 在JAXB或Xstream中,在解组期间是否可以过滤掉类型/值上的某些子元素

Java 在JAXB或Xstream中,在解组期间是否可以过滤掉类型/值上的某些子元素,java,jaxb,xstream,Java,Jaxb,Xstream,希望大家都好,快速提问,看看有没有人有任何反馈 在过去的两天里,我一直在试验JaxB和Xstream。我基本上是使用XML库将XML封送到Java对象或从Java对象中解封。这是一项非常简单的任务,我很快就完成了。但是,我想要解组到Java对象列表中的XML非常长,包含许多子元素,这些子元素可以忽略,不能放入Java对象列表中。 例如,xml看起来类似于: 测试1 2014-01-16 真的 测试2 2014-01-15 假的 测试1 2014-01-14 真的 因此,我希望该库迭代所有xm

希望大家都好,快速提问,看看有没有人有任何反馈

在过去的两天里,我一直在试验JaxB和Xstream。我基本上是使用XML库将XML封送到Java对象或从Java对象中解封。这是一项非常简单的任务,我很快就完成了。但是,我想要解组到Java对象列表中的XML非常长,包含许多子元素,这些子元素可以忽略,不能放入Java对象列表中。 例如,xml看起来类似于:


测试1
2014-01-16
真的
测试2
2014-01-15
假的
测试1
2014-01-14
真的
因此,我希望该库迭代所有xml元素,并将其解组为迄今为止有效的java对象列表,但是在迭代过程中,我希望添加额外的功能来检查类型和标记元素值,如果TYPE value等于Test2,或者如果Flag value等于False,则同时忽略此子元素,并且不将其包含在Java对象的完成列表中。有人知道JaxB或Xstream是否可以实现这一点吗?或者,任何人都可以提出一种更好的方法来实现这一点,它需要最少的代码和手动解析

我一直在研究JaxB中的ValidationEventHandler和XmlAdapter,但我认为它们不允许我做我想做的事情。我很熟悉Xmldapter,但是解组器必须为它处理的每个xml子元素返回null或一个对象,它还将xml语法更改为属性形式,即TYPE=“Test1”等,我看不到任何修改的方法

Xstream允许您实现一个具有canConvert方法的转换器,但是这只适用于类类型,而不适用于子元素类型,我无法检查每个子元素。查看了MapperWrapper Wrapper方法,该方法可以在Xstream中重载,但它只显示元素属性名称,即FLAG,不显示值,而且如果它确实显示值,我也看不到告诉函数忽略子根元素和所述子元素的所有属性


不管怎样,那是我的两分钱。有什么建议吗

如果选择EclipseLink MOXy作为JAXB实现(而不是默认实现),则可以在Java类上使用注释来进行使用XPath表达式的解组。这可以用来过滤掉某些输入。以下是链接:

或者,可能更简单的是,将XML转换API与样式表一起使用,该样式表具有过滤掉不需要的内容的模板。请选中类,它允许您从一个源(例如
InputStream
InputReader
)直接转换为Java对象。可以将其视为中间带有变压器的解组

编辑: 我将帮助您了解基本的XSLT和一些代码。 以下是您描述的样式表:


以及可作为基础的代码摘录:

//获取TransformerFactory
//获取样式表的源,如StreamSource
变压器=变压器厂。新变压器(电源);
//接下来,从JAXBContext创建解组器
Unmarshaller Unmarshaller=context.createUnmarshaller();
//使用解组器创建一个JAXBResult
JAXBResult结果=新的JAXBResult(解组器);
//获取输入XML的源代码,并进行转换
变换(输入源、结果);
//从结果中获取JAXBElement
final JAXBElement jaxbEl=(JAXBElement)result.getResult();
//现在是来自JAXBElement的未编组的javabean
objectbean=jaxbEl.getValue();

,在网站上找到。这就是你所指的吗。我将尝试一些示例,看看它是如何运行的。只有在我完成之前的评论之后,我才看到您的JAXBResult示例。这很有效,谢谢。