java - JAXB 显示 XML 元素,其中文本散布在子元素中

标签 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>

问候, -阿南德

最佳答案

我同意 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/

相关文章:

java - 使用 Google Protocol Buffer JAR 文件构建 Java 应用程序

java - Spring 拦截器适用于 xml 但不适用于配置类

java - 如果 Annotation 是一个接口(interface),那么它如何扩展一个 Object 类?

java - 为什么 JAXB 生成的类具有 protected 成员,我该如何更改它?

java - JAXB 向后兼容性

java - JAXB:如何将映射编码为 <key>value</key>

java - 通过反射调用构造函数而不使用泛型进行强制转换

java - JSP 表达式中的 if-then-else?

Java 1.6 段错误 11 (OSX 10.7.4)

java - 为什么 java 代码没有显示正确的实例数量?