gpt4 book ai didi

java - 如何使用 JAXB 使类字段成为标签名称?

转载 作者:数据小太阳 更新时间:2023-10-29 02:04:56 24 4
gpt4 key购买 nike

我正在使用 Java 和 JAXB 进行 XML 处理。

我有以下类(class):

public class Characteristic {

private String characteristic;
private String value;

@XmlAttribute
public String getCharacteristic() {
return characteristic;
}

public void setCharacteristic(String characteristic) {
this.characteristic = characteristic;
}

@XmlValue
public String getValue() {
return value;
}

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

public static void main(String[] args) {
Characteristic c = new Characteristic();
c.setCharacteristic("store_capacity");
c.setValue(40);
Characteristic c2 = new Characteristic();
c2.setCharacteristic("number_of_doors");
c2.setValue(4);
}

这是我得到的结果:

<characteristics characteristic="store_capacity">40</characteristics>
<characteristics characteristic="number_of_doors">4</characteristics>

我想得到如下结果:

<store_capacity>40</store_capacity>
<number_of_doors>4</number_of_doors>

我怎样才能做到这一点?

最佳答案

您可以使用 @XmlElementRef 的组合和 JAXBElement生成动态元素名称。

思路是:

  • 制作Characteristic JAXBElement 的子类并覆盖 getName()方法返回基于 characteristic 的名称属性(property)。
  • 注释 characteristics@XmlElementRef .
  • 提供 @XmlRegistry ( ObjectFactory ) 与 @XmlElementDecl(name = "characteristic") .

下面是一个working test .

测试本身(没什么特别的):

@Test
public void marshallsDynamicElementName() throws JAXBException {
JAXBContext context = JAXBContext.newInstance(ObjectFactory.class);
final Characteristics characteristics = new Characteristics();
final Characteristic characteristic = new Characteristic(
"store_capacity", "40");
characteristics.getCharacteristics().add(characteristic);
context.createMarshaller().marshal(characteristics, System.out);
}

产生:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<characteristics><store_capacity>40</store_capacity></characteristics>

让我们从 characteristics 开始根元素类。它有一个 characteristics@XmlElementRef 注释的属性.这意味着内容应该是JAXBElement。 s 或 @XmlRootElement - 带注释的类实例。

@XmlRootElement(name = "characteristics")
public class Characteristics {

private final List<Characteristic> characteristics = new LinkedList<Characteristic>();

@XmlElementRef(name = "characteristic")
public List<Characteristic> getCharacteristics() {
return characteristics;
}

}

为了让它工作,你还需要一个 ObjectFactory或者用 @XmlRegistry 注释的东西有相应的 @XmlElementDecl :

@XmlRegistry
public class ObjectFactory {

@XmlElementDecl(name = "characteristic")
public JAXBElement<String> createCharacteristic(String value) {
return new Characteristic(value);
}

}

回想一下,characteristics属性必须包含 @XmlRootElement - 带注释的类实例或 JAXBElement秒。 @XmlRootElement不适合,因为它是静态的。但是JAXBElement是动态的。您可以子类化 JAXBElement并覆盖 getName()方法:

public class Characteristic extends JAXBElement<String> {
private static final long serialVersionUID = 1L;
public static final QName NAME = new QName("characteristic");

public Characteristic(String value) {
super(NAME, String.class, value);
}

public Characteristic(String characteristic, String value) {
super(NAME, String.class, value);
this.characteristic = characteristic;
}

@Override
public QName getName() {
final String characteristic = getCharacteristic();
if (characteristic != null) {
return new QName(characteristic);
}
return super.getName();
}

private String characteristic;

@XmlTransient
public String getCharacteristic() {
return characteristic;
}

public void setCharacteristic(String characteristic) {
this.characteristic = characteristic;
}
}

在这种情况下,我已经覆盖了 getName()动态确定元素名称的方法。如果characteristic属性已设置,其值将用作名称,否则该方法选择默认值 characteristic元素。

测试代码为available on GitHub .

关于java - 如何使用 JAXB 使类字段成为标签名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com