我希望一些元素与文本一起显示,并且还按照所需输出中的指定在其中显示元素。我们如何使用 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>
问候, -阿南德
最佳答案
我同意 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 解析优势 如果这是您的大部分 bean ,我建议找到更好的解决方案或更好的设计:)
关于java - JAXB 显示 XML 元素,其中文本散布在子元素中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5913248/