💻

DOMのElementをJAXBでunmarshalする

2021/01/31に公開

意外にもサンプルプログラムが簡単に見つからなかったのでメモ。

package example.xml;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.IOException;

public class DomJaxb {
    public static void main(
            final String[] args) throws ParserConfigurationException, IOException, SAXException, JAXBException {
        final String xml = "<person><name>hoge</name><age>35</age></person>";
        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                .newInstance();
        final DocumentBuilder documentBuilder = documentBuilderFactory
                .newDocumentBuilder();
        final Document document = documentBuilder
                .parse(new ByteArrayInputStream(xml.getBytes()));

        final JAXBContext jc = JAXBContext.newInstance(Person.class);
        final Unmarshaller unmarshaller = jc.createUnmarshaller();

        final JAXBElement<Person> jaxbElement = unmarshaller
                .unmarshal(document, Person.class);
        System.out.println("JAXBElement: " + jaxbElement.getValue());

        final Person person = (Person) unmarshaller.unmarshal(document);
        System.out.println("unmarshal: " + person);
    }

    @XmlRootElement
    public static class Person {
        @XmlElement
        private String name;
        @XmlElement
        private int age;

        @Override
        public String toString() {
            return String.join("", name + ":" + Integer.toString(age));
        }

    }
}

何がポイントかというと@XmlRootElementのアノテーションをつけるところだった。DOMにしないでstreamなどからそのままunmarshalするときには @XmlRootElement を付けないでも大丈夫だった。

GitHubで編集を提案

Discussion