java JAXB解组树结构
我有XML输入,它本质上是一个树结构。目标是(取消)将代码打包成Java类
<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类的实例中强>
# 1 楼答案
你可能已经想到了这一点。。。 如果您开始在模式级别对其进行建模,如下所示
然后使用XJCAnt Task或call it programmatically或其他方法生成最终得到的JAXB类
加上一个ObjectFactory和一个Config类(本质上是您的结构类)。ObjectFactory给了我们一些“糖”来帮助我们完成可怕的JAXBElement舞蹈
正如Andreas所说,这仍然允许使用字符串和嵌套的KeyValuePair。然后,您必须用验证器包装Config类,以检查没有发生这种情况;比如,
要创建配置,您必须进行JAXBElement舞蹈
好吧,这是一个开始