Я согласен со 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, если это большинство ваших бобов, я предлагаю найти лучшее решение или лучший дизайн :)