如何使用XStream提取XML指定标签内的部分信息并解决属性为空问题
XStream提取Book节点指定字段解决方案
问题根因
你之前转换后属性全为null,核心是没有匹配XML的嵌套层级结构:Book节点位于Origin→MsgData→Transaction三级子节点下,ignoreUnknownElements()仅会忽略未定义的标签,不会自动跨层级匹配属性,直接把Title/Author/Pages定义在Origin类中自然无法匹配到值。
解决方案1:按层级定义实体类(兼容性最好)
步骤1:定义对应实体类
// 最外层根节点 @XStreamAlias("Origin") public class Origin { @XStreamAlias("MsgData") private MsgData msgData; // getter、setter 自行补充 } @XStreamAlias("MsgData") public class MsgData { @XStreamAlias("Transaction") private Transaction transaction; // getter、setter 自行补充 } @XStreamAlias("Transaction") public class Transaction { @XStreamAlias("Book") private Book book; // getter、setter 自行补充 } // 只保留你需要的字段即可,其余字段自动忽略 @XStreamAlias("Book") public class Book { @XStreamAlias("Title") private String title; @XStreamAlias("Author") private String author; @XStreamAlias("Pages") private String pages; // getter、setter 自行补充 }
步骤2:配置XStream执行解析
XStream xstream = new XStream(); // 开启注解扫描 xstream.processAnnotations(Origin.class); // 忽略XML中的class属性(XStream默认将class作为系统保留属性,不处理会影响解析) xstream.aliasSystemAttribute(null, "class"); // 忽略所有未定义的标签 xstream.ignoreUnknownElements(); // 执行转换,xmlStr为你的完整XML字符串 Origin origin = (Origin) xstream.fromXML(xmlStr); // 取值方式:origin.getMsgData().getTransaction().getBook() 即可拿到对应字段
解决方案2:跳过上层节点直接解析Book(无需定义冗余实体)
如果你不想定义上层无用的Origin/MsgData/Transaction类,可以直接定位到Book节点解析:
XStream xstream = new XStream(); xstream.processAnnotations(Book.class); xstream.aliasSystemAttribute(null, "class"); xstream.ignoreUnknownElements(); // 直接设置Book类为根节点别名,无需匹配上层层级 xstream.alias("Book", Book.class); // 先从XML字符串中截取<Book>到</Book>的内容,再执行转换 String bookXml = xmlStr.substring(xmlStr.indexOf("<Book"), xmlStr.indexOf("</Book>") + 7); Book book = (Book) xstream.fromXML(bookXml);
注意事项
- 如果实体类属性名和XML节点名完全一致,可以省略
@XStreamAlias注解,否则必须手动指定别名 - 解析前必须调用
processAnnotations方法开启注解支持,否则所有别名注解不会生效
内容的提问来源于stack exchange,提问作者joão Oliveira
相关产品推荐
相关产品推荐

