Java JAXB显示XML元素,其中文本中穿插着子元素
我希望一些元素与文本一起显示,并按照所需输出中的指定在其中显示元素。我们如何使用JAXB注释来实现这一点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
@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设计让每个人的生活都很艰难。这是我任务的一部分,我们希望实现与我提到的类似的输出