Java 要映射的JAXB节点

Java 要映射的JAXB节点,java,xml,jaxb,Java,Xml,Jaxb,我有一个如下所示的XML文件: 我的身份证 我的类型 价值1 价值1 价值1 我的身份证 我的类型 价值1 价值1 ... 我想在这样一个类上解析XML: 公共类项目{ 私有字符串id; 私有字符串类型; 私有地图值; } 其中id节点和类型节点映射到具有相同名称的属性,并且项目中的所有其他内容都添加到映射中 我曾尝试使用注释XmlJavaTypeAdapter和XmlAnyElement编写一个类,但这并不能满足我的期望: ... 公共类项目{ @XmlElement 私有字符串id; @Xm

我有一个如下所示的XML文件:

我的身份证 我的类型 价值1 价值1 价值1 我的身份证 我的类型 价值1 价值1 ... 我想在这样一个类上解析XML:

公共类项目{ 私有字符串id; 私有字符串类型; 私有地图值; } 其中id节点和类型节点映射到具有相同名称的属性,并且项目中的所有其他内容都添加到映射中

我曾尝试使用注释XmlJavaTypeAdapter和XmlAnyElement编写一个类,但这并不能满足我的期望:

... 公共类项目{ @XmlElement 私有字符串id; @XmlElement 私有字符串类型; @XmlAnyElement @XMLJavaTypeAdapterPadApter.class 私有地图值; } 公共类MapAdapter扩展了XmlAdapter{ @凌驾 公共对象marshalMap v引发异常{ } @凌驾 公共映射解组对象v引发异常{ //v是一个节点,而不是一个节点数组。 //我想得到一个节点数组,将它们转换为一个映射。 // //例如: // //键1->值1 //键2->value2 //键3->value3 // } 你知道我怎么才能得到这个吗

使现代化 澄清我的问题:

我的问题是,我想要在映射中解组的元素不在包装器中,它们与同一级别的其他元素混合在一起

我尝试使用XmlAnyElement和XmlJavaTypeAdapter获取所有剩余元素的映射。但是,这些注释有一个隐式顺序,我得到的是使用适配器解析的元素集合:

XmlAnyElement找到每个剩余的元素,用适配器解析它,并将结果添加到集合中

有没有办法扭转这种局面


我想获得所有剩余元素的集合,然后用XmlAdapter解析该集合以获得映射。

像您一样,我没有成功地编写XmlAdapter。 但还有另一种可能的方法:

在Item类中声明一个用@XmlAnyElement注释的列表, 因此JAXB将使用它进行编组/解编组

但是你想要一张地图,所以你也声明了, 但是使用@XmlTransient进行注释,这样JAXB就不会将其用于编组/解编组

最后在unmarshaller unmarshaller、objectparent之后实现一个私有方法 将列表中的内容铲到地图上。 如中所述 JAXB将在适当的时候调用此方法

public class Item {

    @XmlElement
    private String id;

    @XmlElement
    private String type;

    @XmlAnyElement
    private List<Element> otherElements;

    @XmlTransient  // don't participate in JAXB marshalling/unmarshalling
    private Map<String, String> values;

    @SuppressWarnings("unused")   // called only by JAXB
    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        values = new HashMap<>();
        if (otherElements != null) {
            for (Element element : otherElements) {
                String key = element.getNodeName();
                String value = element.getFirstChild().getNodeValue();
                values.put(key, value);
            }
        }
    }

}
如果需要编写XML文件 在mmarshaller之前,您可能还需要一个私有方法 将地图中的内容铲回列表。 如中所述 JAXB将在适当的时候调用此方法

public class Item {

    @XmlElement
    private String id;

    @XmlElement
    private String type;

    @XmlAnyElement
    private List<Element> otherElements;

    @XmlTransient  // don't participate in JAXB marshalling/unmarshalling
    private Map<String, String> values;

    @SuppressWarnings("unused")   // called only by JAXB
    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        values = new HashMap<>();
        if (otherElements != null) {
            for (Element element : otherElements) {
                String key = element.getNodeName();
                String value = element.getFirstChild().getNodeValue();
                values.put(key, value);
            }
        }
    }

}

请看这个:这对我不起作用。我需要将元素列表解析为一个映射,并且包含元素的节点不在标记中:Value1Value2可能只是一个输入错误:但在Item类中,您需要使用@XmlElement而不是@XmlAttribute来注释id和键入。否则,在解组过程中,它们的XML也会最终出现在@XmlAnyElement中shalling。这是一个打字错误。更改了,谢谢!这正是我要找的!我不知道JAXB回调。谢谢!