我正在使用供应商系统中的XML,我无法更改,并且我正在尝试使用JAXB。 XML用于类似API的REST。请参阅下面的几个消息示例。每个请求/消息都具有相同的根元素名称,称为MsgRequest,它包含每个请求中的几个公共元素,但它还包含依赖于消息类型的元素。
<!-- request 1 -->
<MsgRequest>
<SubType>GetUser</SubType>
<RequestID>1</RequestID>
<UserName>joe</UserName>
</MsgRequest>
<!-- request 2 -->
<MsgRequest>
<SubType>GetCompany</SubType>
<RequestID>2</RequestID>
<CompanyName>joe</CompanyName>
</MsgRequest>
从Java的角度来看,我可以使用继承来模拟它。
class BaseMessage {
String subType;
Integer requestID;
};
class GetUserMessage {
String userName;
};
class GetCompanyMessage {
String companyName;
};
我不明白如何使用JAXB来表示这个XML。我已经做了一些研究并找到了XMLElementRef,但是这将编组引用元素的名称,这不是我想要的。
希望我遗漏了一些明显的东西。任何建议表示赞赏。
答案 0 :(得分:0)
XML并非旨在适合任何特定语言甚至范例。这意味着您可以设计一个可以由Java类层次结构表示的XML,但不能保证某些XML结构可以映射到类层次结构。考虑到XML解析器必须能够从元素的标记名称中确定XML元素的(复杂)类型。因此,如果您有两个标记为<MsgRequest>
的元素,则必须将它们映射到单个Java类型。
您可以为单个复杂类型编写XML Schema,其中包含必需字段subType和requestID,以及可选(minOccurs = 0)字段userName和companyName。它不是好的OO风格,但它会生成你的XML。