我有一个XML输入,它本质上是一棵树形结构。目标是将该代码(反)编组为Java类。
该XML文件包含了典型的键值对。每个值可以包含另一个键值对、键值对列表或仅一个字符串值。
然后我有另一个包装类。
这里是我正在尝试使用的(非)编组逻辑。
这是我目前得到的。它不像我所想的那样工作,但我希望我已经清楚地表达了最终目标应该是什么样子。
我想把开始时的XML放到Structure类的实例中。
<config>
<key-value-pair>
<key>Key1</key>
<value>Value1</value>
</key-value-pair>
<key-value-pair>
<key>Key2</key>
<value>
<key-value-pair>
<key>Subkey2</key>
<value>Value999</value>
</key-value-pair>
</value>
</key-value-pair>
</config>
该XML文件包含了典型的键值对。每个值可以包含另一个键值对、键值对列表或仅一个字符串值。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
static class KeyValuePair {
@XmlElement(name="key")
private String key;
@XmlElement(name="value")
private String value; // here I don't know how to reflect
// the choice of String or another
// list of KeyValuePair objects
@XmlElement(name="value")
private List<KeyValuePair> valuePairs;
// getters/setters here
}
然后我有另一个包装类。
@XmlRootElement(name="config")
@XmlAccessorType(XmlAccessType.FIELD)
static class Structure {
@XmlElement(name="key-value-pair")
private List<KeyValuePair> keyValuePair;
// getters/setters
}
这里是我正在尝试使用的(非)编组逻辑。
Unmarshaller jaxbUnmarshaller = jc.createUnmarshaller();
StringReader reader = new StringReader(input);
Structure struct = (Structure) jaxbUnmarshaller.unmarshal(reader);
// struct doesn't get the data correctly ...
这是我目前得到的。它不像我所想的那样工作,但我希望我已经清楚地表达了最终目标应该是什么样子。
我想把开始时的XML放到Structure类的实例中。
<value>
设置为mixed。不幸的是,这会同时允许文本和元素,你需要在Java代码中进行验证。请参见此处以了解有关XML Schema的一些讨论。 - Andreas