2011-05-06 69 views
0

我希望某些元素可以与文本一起显示,并且还可以根据需要的输出中指定的元素在其中显示元素。我们如何使用JAXB注释完成此操作?JAXB显示带有分隔文本的文本的XML元素

@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

您确定要这么做吗?这种混合模式的XML设计只会让每个人的生活变得困难。 – skaffman 2011-05-06 15:04:06

+0

嗨Skaffman,是的。这是我的一项任务的一部分,我们希望实现类似于我所提到的输出 – Anand 2011-05-06 15:13:39

回答

1

我skaffman同意,首先你需要查找有关该混合模式XML的替代品。

我写了AA解决方案的开始,而不是一个完整的,应该是重构的一些机制,但我相信这将是足够理解我的方向

@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); 
} 

注意:此解决方案不使用JAXB的分析福利@XmlAnyElement 旁边,如果这是我建议找到一个更好的解决办法或一个更好的设计你的大多数豆:)