4

次のxmlを表す単純なjaxbJavaクラスを作成するにはどうすればよいですか?

<rootelem>
  <myelem name="abc" myatt="true"/>

  <myelem name="def">
     <Key value="newvalue"/>
  </myelem>
  <myelem name="xyz">
     <Key value="42"/>
  </myelem>
</rootelem>

複数存在する可能性がありmyelem、それぞれに複数myelemを含めることができますkey

xsdを使いたくない

4

2 に答える 2

4

基本的な例を次に示します。

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);
    }
}
于 2012-11-27T18:24:18.887 に答える
1

これは、XSDを使用せずにクラスを使用してJAXBを使用してXMLとの間で変換するために使用するクラスのコピーです。(XSDの生成にもJAXBを使用します)。

編集:私は質問を読み直しました。そのXMLからJavaソースを生成する方法を尋ねる場合は、自分でそれを理解するか、XSDを使用してJAXBを使用してクラスに変換する必要があります。すでにクラスがあり、XMLをJavaオブジェクトに変換したい場合は、以下の私のコードが役に立ちます。

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;

}
于 2012-11-27T17:54:12.830 に答える