Thunderhashy
Thunderhashy

Reputation: 5321

Creating Jaxb classes from xml without schema

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

Answers (2)

Evgeniy Dorofeev
Evgeniy Dorofeev

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

themanatuf
themanatuf

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

Related Questions