JAXB显示XML元素,文本中散布着子元素

时间:2011-05-06 15:00:36

标签: java annotations jaxb

我希望一些元素与文本一起显示,并且还要在所需输出中指定要在其中显示的元素。我们如何使用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

1 个答案:

答案 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的解析优势 如果这是你的大多数豆类,我建议找到更好的解决方案或更好的设计:)