Java JAXB显示XML元素,其中文本中穿插着子元素

Java JAXB显示XML元素,其中文本中穿插着子元素,java,annotations,jaxb,Java,Annotations,Jaxb,我希望一些元素与文本一起显示,并按照所需输出中的指定在其中显示元素。我们如何使用JAXB注释来实现这一点 @XmlRootElement public class Notifications{ private String subMsg; private String ccNUm; private String bodyMsg; private String paymentInfo; private String returnStatus; } 所需的X

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

信用卡退款3646
支付12.00美元
已经被押回给我们了
问候,,
-Anand

我同意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(); 
            }
        } 
    }
}
@XmlRootElement(name=“通知”)
公开课通知{
@XmlTransient
公共字符串ccNUm;
@XmlTransient
公共字符串subMsg;
@XmlAnyElement
public List el=Lists.newArrayList();
解组后公共无效(解组器u,对象父对象){
对于(元素e:el){
if(“sub_msg”.equalsIgnoreCase(e.getTagName())){
subMsg=e.getTextContent();
节点CreditCardNumberRelation=e.getFirstChild().getNextSibling();
if(“creditcard_no.equalsIgnoreCase(CreditCardNumberRelation.getNodeName()))
ccNUm=CreditCardNumberRelation.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);
}
私人通知测试;
私人字符串msg=“信用卡退款3646/通知>”;
@以前
public void setup()引发JAXBEException{
tested=()JAXBContext.newInstance(U.class).createUnmarshaller().unmarshal(新StringReader(msg));
}
@试验
公共无效测试子消息(){
assertEquals(“信用卡退单3646”,tested.subMsg);
}
@试验
公共无效testCreditCardNum(){
资产质量(“3646”,已测试。ccNUm);
}
注意:除了@xmlanyement之外,该解决方案没有使用jaxb的解析优势
如果这是您的大多数bean,我建议您找到更好的解决方案或更好的设计:)

您确定要这样做吗?这种混合模式的XML设计让每个人的生活都很艰难。这是我任务的一部分,我们希望实现与我提到的类似的输出