Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Xml转换为JavaBean-映射和标记属性的问题_Java_Xml_Jaxb_Marshalling_Unmarshalling - Fatal编程技术网

将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>

我有一个非常棘手的问题。我无法将一段XML文档转换为相应的JavaBean结构。我的问题与标记属性和映射“键/值”属性有关。看看这件作品:

<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