2

Possible Duplicate:
How generate XMLElementWrapper annotation with xjc and customized binding

I would like to be able to process XML of this format using JAXB ...

<configuration>
  <!-- more content here -->
  <things>
    <thing>
      <name>xx1</name>
      <value>yy1</value>
    </thing>
    <thing>
      <name>xx2</name>
      <value>yy2</value>
    </thing>
  </things>
  <!-- more content here -->
</configuration>

I'd like to marshal the above XML into these Java classes (for simplicity, I left modifiers such as public, protected as well as getters/setters away):

class Configuration {
  List<Thing> things;
}

class Thing {
  String name;
  String value;
}

The relevant part of my current XSD structure roughly looks like this:

<complexType name="Configuration">
  <sequence>
    <!-- ... -->
    <element name="things" type="ns:Things" minOccurs="0" maxOccurs="unbounded"/>
    <!-- ... -->
  </sequence>
</complexType>

<complexType name="Things">
  <sequence>
    <element name="thing" type="ns:Thing" minOccurs="0" maxOccurs="unbounded"/>
  </sequence>
</complexType>

Unfortunately, XJC generates also a class for Things even if that is really unnecessary in the Java part of the processing. So my output is this:

class Configuration {
  Things things;
}

class Things {
  List<Thing> thing;
}

class Thing {
  String name;
  String value;
}

Is there any way I can tell XJC to avoid generating this unnecessary class? Or is there any way I can re-phrase my XSD in order to avoid that generation? Both options would be fine with me.

In fact, I guess I would need to generate the @XmlElementWrapper annotation as documented here:

Community
  • 1
  • 1
Lukas Eder
  • 211,314
  • 129
  • 689
  • 1,509

2 Answers2

1

A possible solution is documented in this question here:

How generate XMLElementWrapper annotation with xjc and customized binding

This XJC plugin allows for generating the following Java code, doing precisely what I needed (irrelevant annotations omitted):

class Configuration {

  @XmlElementWrapper(name = "things")
  @XmlElement(name = "thing")
  List<Thing> things;
}

class Thing {
  String name;
  String value;
}
Community
  • 1
  • 1
Lukas Eder
  • 211,314
  • 129
  • 689
  • 1,509
0

You must take into consideration that a complex type translates roughly to a class. So in your XSD schema "Things" complex type is not neccessary. Your XSD should look like:

    <complexType name="Configuration">
    <sequence>
        <element name="things">
        <complexType>
            <sequence>
                <element name="thing" type="ns:Thing" minOccurs="0"
                    maxOccurs="unbounded" />
            </sequence>
            </complexType>F
        </element>
    </sequence>
    <!-- ... -->

</complexType>

<complexType name="Thing">
    <sequence>
        <element name="name" type="string" />
        <element name="value" type="string" />
    </sequence>
</complexType>
Lukas Eder
  • 211,314
  • 129
  • 689
  • 1,509
Fernando Miguélez
  • 11,196
  • 6
  • 36
  • 54
  • That will make XJC generate an inner class (see also the question that I had linked: http://stackoverflow.com/questions/4863655/jaxb-list-tag-creating-inner-class) – Lukas Eder Feb 11 '12 at 15:33