3

JavaBeans を org.w3c.dom.Element
にマーシャリングする必要があります。出力ストリームにはマーシャリングできますが、XML ドキュメントにはマーシャリングできません。
次のテストコードを書きました:

JAXBContext context = JAXBContext.newInstance(String.class);            
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

String xmlRootName = "rootTag";
JAXBElement jaxbElement = new JAXBElement(new QName("", xmlRootName), String.class, "foo bar");
Element element;

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();

m.marshal(jaxbElement, doc);
System.out.println("Document: " + doc);

element = doc.createElement(xmlRootName);
m.marshal(jaxbElement, element);
System.out.println("Element1: " + element);

DOMResult res = new DOMResult();
m.marshal(jaxbElement, res);
element = ((Document)res.getNode()).getDocumentElement();
System.out.println("Element2: " + element);

StringWriter writer = new StringWriter();
m.marshal(jaxbElement, writer);
System.out.println("Writer: " + writer);

出力は次のとおりです。

Document: [#document: null]
Element1: [rootTag: null]
Element2: [rootTag: null]
Writer: <rootTag>foo bar</rootTag>

マーシャリングは出力ストリームに対してのみ機能するようです。xml ドキュメントにマーシャリングする方法は?
私は何を間違っていますか?

4

1 に答える 1

2

オブジェクトを正しくマーシャリングしています。javax.xml.transform結果をログに記録するには、 APIを使用する必要があります。得られる結果は、何でも返すことができる DOM ノードで呼び出されたSystem.out.println結果です。toString

Java モデル

フー

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

デモコード

デモ

import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;

public class Demo {

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

        // Build the Domain Objects
        Foo foo = new Foo();
        foo.setBar("Hello World");

        // Create the Document
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.newDocument();

        // Marshal Object to the Document
        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(foo, document);

        // Perform Operation on Resulting Document
        NodeList elements = document.getElementsByTagName("bar");
        for(int x=0; x<elements.getLength(); x++) {
            System.out.println(elements.item(x).getTextContent());
        }

        // Output Document to System.out
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        t.transform(new DOMSource(document), new StreamResult(System.out));
    }

}

出力

Hello World
<?xml version="1.0" encoding="UTF-8" standalone="no"?><foo><bar>Hello World</bar></foo>
于 2013-09-17T11:59:47.403 に答える