我有一个配置的xml表示如下。
<definitions>
<definition type="MessageReception"> ... </definition>
<definition type="MessageProcessing"> ... </definition>
<definition type="ResponseGeneration"> ... </definition>
</definition>
如您所见,定义的类型取决于属性&#34; type&#34;。 我想使用JAXB框架来解组它。但我只找到了JAXB用法的例子,非常基本的情况,比如书籍,标题,作者,年份......
有没有一种简单的方法可以做我想做的事情?
答案 0 :(得分:0)
为“定义”创建内部类时,应标记注释为@XmlAttribute
的“type”成员。
以下是给定xml的基本工作演示;
public class UnmarshalJaxbDemo {
public static void main(String[] args) {
StringBuffer xmlStr = new StringBuffer( "<definitions>"+
"<definition type=\"MessageReception\"> ... </definition>"+
"<definition type=\"MessageProcessing\"> ... </definition>"+
"<definition type=\"ResponseGeneration\"> ... </definition>"+
"</definitions>" );
try {
JAXBContext context = JAXBContext.newInstance(Definitions.class);
Unmarshaller jaxbUnmarshaller = context.createUnmarshaller();
Definitions definitions = (Definitions) jaxbUnmarshaller.unmarshal(new StreamSource(new StringReader(xmlStr.toString())));
for (Definition defitinion : definitions.getDefinition()) {
System.out.println(defitinion.getType());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class Definition {
@XmlAttribute
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
@XmlRootElement(name = "definitions")
@XmlAccessorType(XmlAccessType.FIELD)
public static class Definitions {
private List<Definition> definition;
public List<Definition> getDefinition() {
return definition;
}
public void setDefinition(List<Definition> definition) {
this.definition = definition;
}
}
}
答案 1 :(得分:0)
您可以使用xsi:type来指示类上的jaxb进行实例化。 例如:
<definitions>
<definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="messageReception">
<receptionField>foo</receptionField>
</definition>
<definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="messageProcessing">
<processingField>bar</processingField>
</definition>
<definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="responseGeneration">
<generationField>baz</generationField>
</definition>
</definitions>
package your.package
class MessageReception {
// getters and setters omitted
String receptionField;
}
jaxbContext = JAXBContext.newInstance("your.package");
Unmarshaller unmarshaller = mJaxbContext.createUnmarshaller();
DefinitionList definitionList = (DefinitionList) unmarshaller.unmarshal(inputStream);