Элементы JAXB Display XML с текстом, перемеженным с подэлементами - PullRequest
0 голосов
/ 06 мая 2011

Я хочу, чтобы некоторые элементы отображались с текстом, а также чтобы элементы отображались внутри них, как указано в желаемом выводе.Как мы можем сделать это, используя аннотации 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 Ответ

1 голос
/ 06 мая 2011

Я согласен со 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);
}

ПРИМЕЧАНИЕ : это решение не использует преимущества синтаксического анализа jaxbКроме @XmlAnyElement, если это большинство ваших бобов, я предлагаю найти лучшее решение или лучший дизайн :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...