将Xml转换为JavaBean-映射和标记属性的问题
我有一个非常棘手的问题。我无法将一段XML文档转换为相应的JavaBean结构。我的问题与标记属性和映射“键/值”属性有关。看看这件作品:将Xml转换为JavaBean-映射和标记属性的问题,java,xml,jaxb,marshalling,unmarshalling,Java,Xml,Jaxb,Marshalling,Unmarshalling,我有一个非常棘手的问题。我无法将一段XML文档转换为相应的JavaBean结构。我的问题与标记属性和映射“键/值”属性有关。看看这件作品: <java> <field name="stepName"> <string value="inject-attribute-step"/> </field> <field name="params"> <map> <entry>
<java>
<field name="stepName">
<string value="inject-attribute-step"/>
</field>
<field name="params">
<map>
<entry>
<key>
<string value="value"/>
</key>
<value>
<string value="4"/>
</value>
</entry>
<entry>
<key>
<string value="variable"/>
</key>
<value>
<string value="progress_bar_status_desc"/>
</value>
</entry>
</map>
</field>
我想我必须创建一个bean“JAVA”作为xml根。但问题与“Field”类有关,该类似乎有不同的实现(rap如何表示此结构?)。然而,一个大问题在于“map”标记的表示,它解释了一个hashmap,该hashmap没有元素“key”和“value”的单个值,而是有另一个标记(“string value=“……/”)。我已经阅读了很多关于编组和解编组的答案,但是只有简单的XML,我需要更复杂的东西(可能是类型适配器)。请有人帮帮我!(对我糟糕的英语感到抱歉:()你看到这个了吗?谢谢你,它可能有用:)
package JAXBImpl;
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Java {
@XmlElement(name="field")
private List<Field> fields;
public List<Field> getFields() {
return fields;
}
public void setFields(List<Field> fields) {
this.fields = fields;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class Field {
@XmlElement(name="map")
private MapNode mapNode;
@XmlElement(name="string")
private StringNode stringNode;
@XmlAttribute
private String name;
public MapNode getMapNode() {
return mapNode;
}
public void setMapNode(MapNode mapNode) {
this.mapNode = mapNode;
}
public StringNode getStringNode() {
return stringNode;
}
public void setStringNode(StringNode stringNode) {
this.stringNode = stringNode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class StringNode {
@XmlAttribute
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class MapNode {
@XmlElement(name="entry")
List<Entry> entries;
public List<Entry> getEntries() {
return entries;
}
public void setEntries(List<Entry> entries) {
this.entries = entries;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class Entry {
@XmlElement(name="key")
private Key key;
@XmlElement(name="value")
private Value value;
public Key getKey() {
return key;
}
public void setKey(Key key) {
this.key = key;
}
public Value getValue() {
return value;
}
public void setValue(Value value) {
this.value = value;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class Key {
@XmlElement(name="string")
StringNode stringNode;
public StringNode getStringNode() {
return stringNode;
}
public void setStringNode(StringNode stringNode) {
this.stringNode = stringNode;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
class Value {
@XmlElement(name="string")
private StringNode stringNode;
public StringNode getStringNode() {
return stringNode;
}
public void setStringNode(StringNode stringNode) {
this.stringNode = stringNode;
}
}
public class Main {
public static void main (String args [])
throws Exception
{
File file = new File("test.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Java.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Java java = (Java) jaxbUnmarshaller.unmarshal(file);
for(Field field : java.getFields()) {
System.out.println("-----------------------------------------------");
System.out.println("Field Name = " + field.getName());
if(field.getStringNode() != null) {
System.out.println("String Value = " + field.getStringNode().getValue());
}
if(field.getMapNode() != null) {
for(Entry entry : field.getMapNode().getEntries()) {
System.out.println("Key = " + entry.getKey().getStringNode().getValue());
System.out.println("Value = " + entry.getValue().getStringNode().getValue());
}
}
}
}
}
-----------------------------------------------
Field Name = stepName
String Value = inject-attribute-step
-----------------------------------------------
Field Name = params
Key = value
Value = 4
Key = variable
Value = progress_bar_status_desc