JAXB将xml附加到要封送的对象中

时间:2016-06-24 19:00:56

标签: java xml jaxb append

我想将一个封送对象(xml代码)附加到另一个要封送的对象中。

@XmlRootElement
object Child{ 
    ...
}

@XmlRootElement
object Parent{
    @XmlElement
    object Any;
}

Marshaling Child:

<child xmlns="namespaceOfChild.org">
    <...>
    <...>
<\child>

我想在Parent.Any上面设置xml,以便在编组Parent时显示代码。

<parent xmlns="namespaceOfParent.org">
    <any>
        <child xmlns="namespaceOfChild.org">
            <...>
            <...>
        <\child>
    <\any>
<\parent>

请注意,名称空间和子项的其他属性必须遵循child tag作为上面的代码。当我在Parent.Any上设置对象Child本身时,我获得了成功,但Child的属性看起来像Parent的属性。

2 个答案:

答案 0 :(得分:0)

我明白了!我可以将内部元素Child保存在Document(org.w3c.dom.Document)中,并使用该函数将返回Child的{​​{1}}封送到document.getDocumentElement()(org.w3c.dom.Node)。然后我使用此NodeNode中设置对象,然后我可以整理Parent.Any

编组儿童的功能:

Parent

封送父母的功能:

private static Node marshal(Object obj) throws JAXBException {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    Document doc = null;
    try {
        DocumentBuilder db = dbf.newDocumentBuilder();
        doc = db.newDocument();
    } catch (ParserConfigurationException ex) {
        throw new JAXBException(ex);
    }

    context = JAXBContext.newInstance("org.openarchives.oai._2_0.oai_dc");
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.marshal(obj, doc);
    return  doc.getDocumentElement();
}

当我封送父级时,Child的属性位于private static void marshal(Object obj, OutputStream stream) throws JAXBException { context = JAXBContext.newInstance("org.openarchives.oai._2"); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(obj, stream); } 内,而Parent的属性位于<child>内。

答案 1 :(得分:0)

很好的答案,它引导我在我的环境中找到最终的解决方案。

对于你们中的一个,我们试图用JAX-RS和JERSEY JAXB实现这一点,这是我必须做的最后一步。

假设我们有一个名为metadataType的父类,其子类型为“any”,我们想要分配一个名为Record的类

这是我在创建对象时所做的对象的“设置”

ReactDOM.render(
  <Router history={hashHistory}>
    <Route path="/" component={Main}>
        <Route path="countdown" component={Countdown} />
    </Route>
  </Router>,
  document.getElementById('app')
);

在类Record中我必须添加@XMLRootElement,如:

Document doc = null;
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(OAIPMHtype.class,Record.class,RDF.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.europeana.eu/schemas/ese/ " +
                "http://www.europeana.eu/schemas/ese/ESE-V3.4.xsd");
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);

        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            doc = db.newDocument();

        } catch (ParserConfigurationException ex) {
            throw new JAXBException(ex);
        }
        jaxbMarshaller.marshal(record, doc);
    } catch (JAXBException e) {
        throw new JAXBException(e);
    }
        metadataType.setAny(doc.getDocumentElement());

然后,如果你让泽西马歇尔自动或不让这个对象生成

@XmlRootElement(name = "record",namespace = "http://www.europeana.eu/schemas/ese/")