XStream解析XML:如何无需专用类获取元素属性?
XStream解析带属性的元素(无需大量专用类)
针对你遇到的<datatype byteswap="true">UINT32_T</datatype>这类带属性+文本内容的元素解析问题,不用为每个字段单独创建外部类,用XStream自带的ToAttributedValueConverter结合静态内部类就能解决,既简洁又符合需求:
修正后的实体类代码
import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter; import java.util.List; @XStreamAlias("type") public class Type { @XStreamAlias("name") public String name; @XStreamAlias("i-name") public String iName; @XStreamAlias("documentation") // 如果存在多个<documentation>标签才需要@XStreamImplicit,单个可移除 @XStreamImplicit public List<Documentation> documentation; @XStreamAlias("comments") @XStreamImplicit public List<String> comments; @XStreamAlias("datatype") public Datatype datatype; // 静态内部类封装datatype的属性与文本,无需单独建文件 @XStreamConverter(value = ToAttributedValueConverter.class, strings = {"value"}) public static class Datatype { @XStreamAlias("byteswap") @XStreamAsAttribute public String byteswap; // 对应<datatype>的文本内容 public String value; } // 如果后续需要解析<documentation>的enc属性,同样用内部类处理 @XStreamConverter(value = ToAttributedValueConverter.class, strings = {"content"}) public static class Documentation { @XStreamAlias("enc") @XStreamAsAttribute public String enc; public String content; } }
关键说明
- ToAttributedValueConverter的作用:指定类中某个字段(通过
strings参数)作为XML元素的文本内容,其他带@XStreamAsAttribute注解的字段作为元素的属性。 - 静态内部类:无需单独创建外部类文件,仅在Type类内部定义,满足“避免大量专用类”的需求。
- 初始化XStream:必须启用注解处理,否则转换器和别名不生效:
XStream xstream = new XStream(); // 自动检测并处理所有注解 xstream.autodetectAnnotations(true); // 或者手动指定要处理的类 // xstream.processAnnotations(Type.class);
解析后取值
解析完成后,直接通过对象层级获取数据:
Type type = (Type) xstream.fromXML(xmlContent); String datatypeValue = type.datatype.value; // 输出 UINT32_T String byteswap = type.datatype.byteswap; // 输出 true
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

