如何使用XStream从指定XML路径/file/labels/开始解析?
解决XML指定路径下元素的解析问题
要只解析/file/labels/路径下的<label>元素,你需要修改StaxEventItemReader的配置,通过XPath表达式精确限定目标元素的路径,避免匹配所有同名元素。
修改后的代码
1. 保持Marshaller配置不变
你的XStreamMarshaller配置无需改动,继续使用原有的别名和权限设置:
@Bean public XStreamMarshaller marshaller() { XStreamMarshaller marshaller = new XStreamMarshaller(); marshaller.setAliases(Map.of( "label", Label.class )); marshaller.setTypePermissions(new ExplicitTypePermission(new Class[] { Label.class })); return marshaller; }
2. 配置StaxEventItemReader时添加XPath限定
在构建StaxEventItemReader时,通过xpathExpression()方法指定精确的路径/file/labels/label,这样只会匹配该路径下的<label>元素:
@Bean public StaxEventItemReader<Label> labelItemReader() { return new StaxEventItemReaderBuilder<Label>() .name("labelItemReader") .resource(new ClassPathResource("file.xml")) .addFragmentRootElements("label") .xpathExpression("/file/labels/label") // 关键:限定目标元素的XPath路径 .unmarshaller(marshaller()) .build(); }
原理说明
addFragmentRootElements("label")指定要读取的元素名称为<label>xpathExpression("/file/labels/label")进一步过滤,只选择位于/file/labels/节点下的<label>元素,完全排除其他位置的同名元素
内容的提问来源于stack exchange,提问作者Arno 2501
相关产品推荐
相关产品推荐

