给出类似的东西:
<root>
<wrapper>
<wrapped id="..."/>
<wrapped id="..."/>
</wrapper>
</root>
如何将其映射到此POJO:
public class Root {
public Set<UUID> myIds = new LinkedHashSet();
}
我想知道,因为@XmlElement( name = "wrapped" ) @XmlElementWrapper( name = "wrapper" )
的工作方式与我想要的有些相似,是否有东西可以获得属性?
注意:我没有使用moxy,据我所知,我不能使用xpaths。我试图避开@XmlJavaTypeAdapter
路线。
答案 0 :(得分:0)
您需要稍微修改一下根类,
这样它就会包含Set<Wrapped>
而不是Set<UUID>
。
@XmlRootElement(name = "root")
public class Root {
@XmlElementWrapper(name = "wrapper")
@XmlElement(name = "wrapped")
public Set<Wrapped> myWrappeds = new LinkedHashSet<>();
}
你需要一个单独的<wrapped>
元素类
令我惊讶的是,您不需要@XmlJavaAdapter
id
,因为JAXB在java.util.UUID
和String
之间已经有built-in converter。
public class Wrapped {
@XmlAttribute(name = "id")
public UUID id;
}
我已使用此XML输入文件检查了上述内容
<root>
<wrapper>
<wrapped id="550e8400-e29b-11d4-a716-446655440000"/>
<wrapped id="550e8400-e29b-11d4-a716-446655440001"/>
</wrapper>
</root>
和这个再现原始XML的main
方法:
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
File file = new File("root.xml");
Root root = (Root) unmarshaller.unmarshal(file);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}