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

如何复用Java类处理不同name属性的XML编组?

问题描述

需要创建Java类来编组以下两个XML示例,要求复用同一个类处理不同name属性值的XML,同时支持动态修改该属性值:

示例1 XML:

<ns1:container name="test">
    <ns1:subContainer type="String">
        <ns1:value>hello_world</ns1:value>
    </ns1:subContainer>
</ns1:container> 

示例2 XML:

<ns1:container name="test2">
    <ns1:subContainer type="String">
        <ns1:value>hello_world2</ns1:value>
    </ns1:subContainer>
</ns1:container> 

当前编写的Java类如下,但@XmlAttribute(name="test")中的参数设置错误,无法适配不同属性值的XML:

public class Container {
    @XmlAttribute(name="test")
    private String name;

    @XmlElement(name="subContainer", namespace = "ns1")
    private SubContainer subContainer;

    public Container() {
    }

    public Container(String value, String name) {
        this.name = name;
        this.subContainer = new SubContainer("String", value);
    }
}

请问如何复用该类处理第二个XML?或有没有更好的动态修改属性的方法?


解决方案

你混淆了@XmlAttribute的参数意义:name参数指定的是XML属性的名称(即<container>标签上的name这个属性名),而非属性的值。之前把属性值test写到了name参数里,这是核心错误。

修正后的Container类

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "container", namespace = "ns1")
public class Container {
    // name参数固定为"name",对应XML属性的名称;Java字段name存储属性的动态值
    @XmlAttribute(name = "name")
    private String name;

    @XmlElement(name = "subContainer", namespace = "ns1")
    private SubContainer subContainer;

    // JAXB需要无参构造器
    public Container() {
    }

    public Container(String value, String name) {
        this.name = name;
        this.subContainer = new SubContainer("String", value);
    }

    // 必须添加getter/setter,JAXB需要访问字段
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public SubContainer getSubContainer() {
        return subContainer;
    }

    public void setSubContainer(SubContainer subContainer) {
        this.subContainer = subContainer;
    }
}

配套的SubContainer类

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;

public class SubContainer {
    @XmlAttribute(name = "type")
    private String type;

    @XmlElement(name = "value", namespace = "ns1")
    private String value;

    public SubContainer() {
    }

    public SubContainer(String type, String value) {
        this.type = type;
        this.value = value;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

使用方式

只需在创建Container实例时传入不同的name值,即可生成对应属性的XML:

// 生成示例1的XML
Container container1 = new Container("hello_world", "test");
// 生成示例2的XML
Container container2 = new Container("hello_world2", "test2");

核心要点

  • @XmlAttribute(name = "name")中的"name"是固定的XML属性名称,不需要动态修改。
  • Java字段private String name用来存储属性的动态值,通过构造器或setter方法即可修改,完全复用同一个类处理不同XML。

内容的提问来源于stack exchange,提问作者user19906023

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:20:24