You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

关键说明

  1. ToAttributedValueConverter的作用:指定类中某个字段(通过strings参数)作为XML元素的文本内容,其他带@XStreamAsAttribute注解的字段作为元素的属性。
  2. 静态内部类:无需单独创建外部类文件,仅在Type类内部定义,满足“避免大量专用类”的需求。
  3. 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:15:32