Jaxb вопрос о корневых элементах - PullRequest
1 голос
/ 28 марта 2011

Мне нужно создать xml для отправки в другое приложение в следующем формате, и я пытаюсь использовать jaxb. Всегда есть только 1 вхождение бара. Есть ли способ сделать это, или это недопустимый XML, потому что он имеет 2 корневых элемента, и другое приложение должно будет изменить способ, которым он принимает XML?

<FOO>
 <BAR>
  <id>1</id>
  <POINTS>111</POINTS>
  <CODE>123</CODE>
 </BAR>
</FOO>

1 Ответ

1 голос
/ 28 марта 2011

Ниже приведено несколько подходов:

Стандартный JAXB

Следующее будет работать с любой реализацией JAXB (Metro, MOXy , JaxMe, так далее).Вы можете создать элемент " FOO ", а затем направить в него свой экземпляр Bar.Код ниже, как продемонстрировать это с помощью StAX (это также можно сделать с помощью DOM или SAX):

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLOutputFactory xof = XMLOutputFactory.newFactory();
        XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out);
        xsw.writeStartDocument();
        xsw.writeStartElement("FOO");

        Bar bar = new Bar();
        bar.setId(1);
        bar.setPoints(111);
        bar.setCode(123);

        JAXBContext jc = JAXBContext.newInstance(Bar.class);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.marshal(bar, xsw);

        xsw.writeEndElement();
        xsw.writeEndDocument();
        xsw.close();
    }

}

EclipseLink JAXB (MOXy)

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

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="FOO")
@XmlType(propOrder={"id", "points", "code"})
public class Bar {

    private int id;
    private int points;
    private int code;

    @XmlPath("BAR/id/text()")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @XmlPath("BAR/POINTS/text()")
    public int getPoints() {
        return points;
    }

    public void setPoints(int points) {
        this.points = points;
    }

    @XmlPath("BAR/CODE/text()")
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

}

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

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