我从REST服务获取XML,如下所示:
<entity>
<foo>
<count>1</count>
<date>1970-01-01</date>
<margin>78.67</margin>
</foo>
<bar>
<count>2</count>
<date>1450-09-17</date>
<margin>24.56</margin>
</bar>
<baz>
<count>11</count>
<date>1968-11-12</date>
<margin>98.76</margin>
</baz>
</entity>
我正在使用具有以下内容的类Entity.java进行语法分析:
@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity implements Serializable {
@XmlElements({
@XmlElement(name="foo"),
@XmlElement(name="bar"),
@XmlElement(name="baz")
})
private List<EntityElement> entityElements;
....
使用EntityElement类,如:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class EntityElement implements Serializable {
@XmlElement(required = true)
private int count
@XmlElement(required = true)
private String date;
@XmlElement(required = false)
private long margin;
....
这一切都与我期望的完全一样,我得到了一个EntityElements列表。我想要做的是添加一个名称字段,并使用找到的元素的名称(foo,bar或baz)填充它,但我没有看到任何方法这样做。任何帮助或建议将不胜感激。
答案 0 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
对于此用例,您可以使用我们在EclipseLink 2.5.1中添加到MOXy的@XmlVariableNode
。
<强>实体强>
我们将在@XmlVariableNode
字段中使用MOXy的entityElements
。在该字段中,我们在目标类上指定表示元素名称的字段。
import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVariableNode;
@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity implements Serializable {
@XmlVariableNode("name")
private List<EntityElement> entityElements;
}
<强> EntityElement 强>
我们将使用@XmlTransient
注释来防止name
字段的值被编组为子元素。
import java.io.Serializable;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class EntityElement implements Serializable {
@XmlTransient
private String name;
@XmlElement(required = true)
private int count;
@XmlElement(required = true)
private String date;
@XmlElement(required = false)
private long margin;
}
<强> 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
<强>演示强>
由于MOXy是JAXB(JSR-222)实现,因此只需要标准的运行时API。
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Entity.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum19194567/input.xml");
Entity entity = (Entity) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(entity, System.out);
}
}
<强> input.xml中/输出强>
这是您提问的XML文档。
<?xml version="1.0" encoding="UTF-8"?>
<entity>
<foo>
<count>1</count>
<date>1970-01-01</date>
<margin>0</margin>
</foo>
<bar>
<count>2</count>
<date>1450-09-17</date>
<margin>0</margin>
</bar>
<baz>
<count>11</count>
<date>1968-11-12</date>
<margin>0</margin>
</baz>
</entity>