Generate Java classes with JAXB from a DTD file - how can I modify the DTD?

dtd, java, jaxb, xml

Solution

In his response, mavrav seems to tell that it's impossible with DTD. I don't know well how to use DTD. But if you can, translate your DTD in XML schema.

I tried with this shema:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:hr="http://mycompany.com/schema"
        elementFormDefault="qualified"
        targetNamespace="http://mycompany.com/schema">
    <!-- Contents -->
    <xs:element name="persons">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="header" />
                <xs:element name="content" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="groups">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="header" />
                <xs:element name="content" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Header -->
    <xs:element name="header">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="version" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Content -->
    <xs:element name="content">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="person" maxOccurs="unbounded" />
                <xs:element name="group" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Person -->
    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="p_id" type="xs:integer" />
                <xs:element name="p_name" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Group -->
    <xs:element name="group">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="g_id" type="xs:integer" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

After I generated Java classes with the following cmd:

xjc -p com.mypackage schema.xsd

And it gives me the following code for the Content class:

@XmlRootElement(name = "content")
public class Content {

    @XmlElement(required = true)
    protected List<Object> person;
    @XmlElement(required = true)
    protected List<Object> group;

    public List<Object> getPerson() {
        if (person == null) {
            person = new ArrayList<Object>();
        }
        return this.person;
    }

    public List<Object> getGroup() {
        if (group == null) {
            group = new ArrayList<Object>();
        }
        return this.group;
    }
}

Problem

I want to generate Java classes from a dtd file using JAXB. The dtd looks like this: ``` <!--Contents--> <!ELEMENT persons (header, content) > <!ELEMENT groups (header, content) > <!--Header--> <!ELEMENT header (version) > <!ELEMENT version(#PCDATA) > <!--Content--> <!ELEMENT content(person, group)* > <!--Person--> <!ELEMENT person(p_id, p_name) > <!ELEMENT p_id (#PCDATA) > <!ELEMENT p_name (#PCDATA) > <!--Group--> <!ELEMENT group(g_id) > <!ELEMENT g_id(#PCDATA) > ``` When generating the classes with JAXB I get the following ones: - ObjectFactory - Content - Person - Persons - Group - Groups In the Content class the method to retreive all the persons and groups is ``` public List<Object> getPersonOrGroup() { if (personOrGroup == null) { personOrGroup = new ArrayList<Object>(); } return this.personOrGroup; } ``` Is there anything I can change in the dtd file so the generation of Java classes will make the `persons` and `groups` separated in the `Content` java class, so to retreive all persons and groups would be to make a call to `Content.getPersons()` and `Content.getGroups()` respectivly?

Original source