我正在本着这种精神升级当前具有 XML 表示形式的 Java 对象:
<myObjects>
<myObject uid="42" type="someEnum">
<name>Waldo</name>
<description>yada yada</description>
<myElement>some_string</myElement>
...
</myObject>
...
</myObjects>
myElement 是可选的 - 在 Java 中它可以为 null/在 XML 中可以省略。
我添加的字段仅与 myElement 具有实际值相关
(为了保持与以前的 XML 的兼容性,它本身是可选的)
我正在努力避免这种情况:
<myElement>some_string</myElement>
<myAttr>foo</myAttr>
并且更喜欢这样的东西:
<myElement myAttr="foo">some_string</myElement>
但是我花了两天时间思考如何注释它。
- 我想用 XmlTransient 标记它,并让 XmlAnyElement 在解码时捕获它 - 但这似乎在将对象从 Java 编码回XML。
- 我尝试为该元素创建一个 XmlAdapter - 但 unmarshal 方法仅获取内部内容(“some_string”)。 我是否错过了这种技术的某些东西?
- 有没有办法只获取字符串形式的元素(“
some_string ”),我将自己处理它? - 您推荐其他方法吗?
最佳答案
您可以使用EclipseLink JAXB (MOXy) @XmlPath 扩展可以轻松完成此任务:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyObject {
@XmlAttribute
private int uid;
@XmlAttribute
private String type;
private String name;
private String description;
private String myElement;
@XmlPath("myElement/@myAttr")
private String myAttr;
}
此类将与以下 XML 交互:
<myObject uid="42" type="someEnum">
<name>Waldo</name>
<description>yada yada</description>
<myElement myAttr="foo">some_string</myElement>
</myObject>
使用以下演示代码:
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(MyObject.class);
File file = new File("input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyObject myObject = (MyObject) unmarshaller.unmarshal(file);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(myObject, System.out);
}
}
要将 MOXy 指定为 JAXB 实现,您需要在与模型类相同的包中包含一个名为 jaxb.properties 的文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
有关 MOXy 基于 XPath 的映射的更多信息,请参阅:
关于jaxb - 注释向元素添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4192687/