gpt4 book ai didi

jaxb marshall 字段作为具有属性的 xml 节点

转载 作者:行者123 更新时间:2023-12-01 12:49:38 26 4
gpt4 key购买 nike

public class Person {
public String name; ...
}

当我编码时,我想获得一个具有值属性的名称节点

<name value="arahant" />

代替:

<name>arahant</name>

我怎样才能做到这一点?我试着查看 XmlElementWrapper,但这只允许用于集合。我需要为此编写自定义代码吗?

最佳答案

有几个选项可供您支持此用例。


选项 #1 - XmlAdapter 任何 JAXB (JSR-222) 实现

此方法适用于任何 JAXB (JSR-222)合规实现。

值适配器

XmlAdapter 允许您将一个对象当作另一个对象来编码。在我们的 XmlAdapter 中,我们会将 String 值与一个对象相互转换,该对象具有一个映射到 @XmlAttribute 的属性。

package forum13489697;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ValueAdapter extends XmlAdapter<ValueAdapter.Value, String>{

public static class Value {
@XmlAttribute
public String value;
}

@Override
public String unmarshal(Value value) throws Exception {
return value.value;
}

@Override
public Value marshal(String string) throws Exception {
Value value = new Value();
value.value = string;
return value;
}

}

@XmlJavaTypeAdapter 注释用于指定 XmlAdapter 应该与字段或属性一起使用。

package forum13489697;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Person {

@XmlJavaTypeAdapter(ValueAdapter.class)
public String name;

}

选项 #2 - EclipseLink JAXB (MOXy)

我是 EclipseLink JAXB (MOXy) lead,我们提供了 @XmlPath 扩展,它允许您轻松地进行基于路径的映射。

package forum13489697;

import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
public class Person {

@XmlPath("name/@value")
public String name;

}

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供程序,您需要在与域模型相同的包中包含一个名为 jaxb.properties 的文件,其中包含以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示代码

以下演示代码可与任一选项一起使用:

演示

package forum13489697;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum13489697/input.xml");
Person person = (Person) unmarshaller.unmarshal(xml);

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}

}

input.xml/Output

<?xml version="1.0" encoding="UTF-8"?>
<person>
<name value="arahant" />
</person>

关于jaxb marshall 字段作为具有属性的 xml 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13489697/

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