我希望一些元素与文本一起显示,并且还要在所需输出中指定要在其中显示的元素。我们如何使用JAXB注释来实现这一目标?
@XmlRootElement
public class Notifications{
private String subMsg;
private String ccNUm;
private String bodyMsg;
private String paymentInfo;
private String returnStatus;
}
所需的XML输出
<notifications>
<sub_msg>
credit card charge back <creditcard_no>3646</creditcard_no>
</sub_msg>
<body_msg>
Payment of <payment_amount> $12.00 </payment_amount>
has been <return_status> Charged back </return_staus> to us
</body_msg>
</notifications>
此致 -Anand
答案 0 :(得分:1)
我同意skaffman,首先你需要寻找这种混合模式xml的替代品。
我写了一个解决方案的开头,而不是一个完整的解决方案,应该重构一些机制,但我相信它足以理解我的方向
@XmlRootElement(name="notifications")
public class Notification {
@XmlTransient
public String ccNUm;
@XmlTransient
public String subMsg;
@XmlAnyElement
public List<Element> el = Lists.newArrayList();
public void afterUnmarshal(Unmarshaller u , Object parent) {
for (Element e: el) {
if ("sub_msg".equalsIgnoreCase(e.getTagName())){
subMsg = e.getTextContent();
Node creditCardNumberElement = e.getFirstChild().getNextSibling();
if ("creditcard_no".equalsIgnoreCase(creditCardNumberElement.getNodeName()))
ccNUm = creditCardNumberElement.getTextContent();
}
}
}
}
以下是测试:
private Notification tested;
private String msg = "<notifications><sub_msg>credit card charge back <creditcard_no>3646</creditcard_no></sub_msg>/notifications>";
@Before
public void setup() throws JAXBException{
tested = () JAXBContext.newInstance(U.class).createUnmarshaller().unmarshal(new StringReader(msg));
}
@Test
public void testSubMessage(){
assertEquals("credit card charge back 3646",tested.subMsg);
}
@Test
public void testCreditCardNum(){
assertEquals("3646",tested.ccNUm);
}
注意:此解决方案不使用@XmlAnyElement旁边的jaxb的解析优势 如果这是你的大多数豆类,我建议找到更好的解决方案或更好的设计:)