Java 要映射的JAXB节点
我有一个如下所示的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找到每个剩余的元素,用适配器解析它,并将结果添加到集合中 有没有办法扭转这种局面Java 要映射的JAXB节点,java,xml,jaxb,Java,Xml,Jaxb,我有一个如下所示的XML文件: 我的身份证 我的类型 价值1 价值1 价值1 我的身份证 我的类型 价值1 价值1 ... 我想在这样一个类上解析XML: 公共类项目{ 私有字符串id; 私有字符串类型; 私有地图值; } 其中id节点和类型节点映射到具有相同名称的属性,并且项目中的所有其他内容都添加到映射中 我曾尝试使用注释XmlJavaTypeAdapter和XmlAnyElement编写一个类,但这并不能满足我的期望: ... 公共类项目{ @XmlElement 私有字符串id; @Xm
我想获得所有剩余元素的集合,然后用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回调。谢谢!