JAXB Добавление атрибутов в XmlElement для простых типов данных - PullRequest
3 голосов
/ 06 мая 2011

Я хочу добавить некоторые атрибуты к элементам Xml, используя JAXB при сортировке из JavaBeans.Элементы Xml - это простые типы данных, такие как String.Поэтому я не хочу создавать новые классы.Например, желаемый результат будет:

<notifications>
<date>04/20/2011</date>
<subject creditcard_num="22678" checknum="8904">Credit Card Charge Back</subject>
<body payment_amount="34.00" return_status="charged back">some text</body>
</notifications

Я не хочу определять предмет и тело как отдельные классы.

-Anand

Ответы [ 2 ]

6 голосов
/ 06 мая 2011

Мое решение требует определения класса для темы и тела, но желаемый результат будет соответствовать запросу. Я использую @XmlValue для сообщения и @XmlAttribute для атрибутов

@Test
public void testAll() throws JAXBException
{
    String msg = "<notifications><date>04/20/2011</date><subject creditcard_num='22678' checknum='8904'>Credit Card Charge Back</subject><body payment_amount='34.00' return_status='charged back'>some text</body></notifications>";
    Notifications tested = (Notifications) JAXBContext.newInstance(Notifications.class).createUnmarshaller().unmarshal(new StringReader(msg));
    assertEquals("Credit Card Charge Back",tested.subject.value);
    assertEquals("8904",tested.subject.checknum);
    assertEquals("22678",tested.subject.creditcard_num);
}
@XmlRootElement
public static class Notifications{
    public String date;
    public Subject subject;
}

public static class Subject
{
    @XmlValue
    public String value;

    @XmlAttribute(name="creditcard_num")
    public String  creditcard_num;

    @XmlAttribute(name="checknum")
    public String  checknum;
}

ПРИМЕЧАНИЕ : Я только написал предметную часть, интересно, можно ли использовать @XmlPath для устранения необходимости в разных классах

2 голосов
/ 07 мая 2011

Вы можете использовать EclipseLink JAXB (MOXy) аннотацию @XmlPath для решения этой проблемы (я технический руководитель MOXy):

Уведомления

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Notifications {

    private String date;

    @XmlPath("subject/@creditcard_num")
    private String creditcardNum;

    @XmlPath("subject/@checknum")
    private String checknum;

    private String subject;

    @XmlPath("body/@payment_amount")
    private String paymentAmount;

    @XmlPath("body/@return_status")
    private String returnStatus;

    private String body;

}

jaxb.properties

Чтобы использовать MOXy в качестве вашей реализации JAXB, вам нужно поместить файл с именем jaxb.properties в тот же пакет, что и классы вашей модели, с помощьюследующая запись:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Демо

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Notifications.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Notifications notifications = (Notifications) unmarshaller.unmarshal(new File("input.xml"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(notifications, System.out);
    }

}

Для получения дополнительной информации:

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