Reputation: 5321
How Do I create a simple jaxb Java class to represent the following xml
<rootelem>
<myelem name="abc" myatt="true"/>
<myelem name="def">
<Key value="newvalue"/>
</myelem>
<myelem name="xyz">
<Key value="42"/>
</myelem>
</rootelem>
There can be multiple myelem
and each myelem
can contain multiple key
I do not want to use a xsd
Upvotes: 5
Views: 13222
Reputation: 135992
Here is a basic example:
import java.io.FileReader;
import java.util.List;
import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="rootelem")
class RootElem {
List<MyElem> myelem;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="myelem")
class MyElem {
@XmlAttribute
String name;
@XmlAttribute
Boolean myatt;
@XmlElement(name="Key")
List<Key> keys;
}
@XmlAccessorType(XmlAccessType.FIELD)
class Key {
@XmlAttribute
String value;
}
public class Test1 {
public static void main(String[] args) throws Exception {
RootElem r = JAXB.unmarshal(new FileReader("test.xml"), RootElem.class);
System.out.println(r);
JAXB.marshal(r, System.out);
}
}
Upvotes: 4
Reputation: 3130
Here is a copy of a class we use to convert to/from XML using JAXB using classes and no XSD. (We also use JAXB to generate our XSD).
EDIT: I just re-read the question. If you're asking how to generate the Java source from that XML, then you're going to have to figure that out on your own or use an XSD and use JAXB to convert it to classes. If you already have the class and you want to convert the XML into a Java object, then my code below will work for you.
package com.mycompany.types;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlTransient;
/**
* Utility class to make it convenient to marshal and unmarshal the classes
* generated by JAXB.
*/
@XmlTransient
public final class Utility {
//
// Static initialization
//
static {
try {
JAXB_CONTEXT = JAXBContext.newInstance(TestClass.class);
// The following fails with a javax.xml.bind.JAXBException.
// class mycompany.types.TestClass nor any of its super class is known
// to this context.
// JAXB_CONTEXT =
// JAXBContext.newInstance("com.mycompany.types",
// Utility.class.getClassLoader());
}
catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
//
// Constructors
//
//
// Hidden constructor that prevents an object from being created.
//
private Utility() {
// Do nothing.
}
//
// Additional methods
//
/**
* Unmarshals an XML string to a TestClass object.
*
* @param xml the XML string to parse
* @return the resulting TestClass
* @throws JAXBException if there are XML errors
*/
public static TestClass parseTestClass(String xml) throws JAXBException {
Unmarshaller unmarshaller = JAXB_CONTEXT.createUnmarshaller();
return (TestClass)unmarshaller.unmarshal(new StringReader(xml));
}
/**
* Marshals a TestClass object to an XML string.
*
* @param testClass
* @return the resulting XML string
* @throws JAXBException if there are XML errors
*/
public static String printTestClass(TestClass testClass) throws JAXBException {
Marshaller marshaller = JAXB_CONTEXT.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(testClass, writer);
return writer.toString();
}
//
// Attributes
//
private static final JAXBContext JAXB_CONTEXT;
}
Upvotes: 1