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

送分小仙女□ 提交于 2019-12-29 06:29:27

问题


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?


回答1:


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;
    }
}



回答2:


xjc -dtd -d generatedsrc -p com.examples log4j.dtd

will generate the classes in directory generatedsrc and the package used will be com.examples.

you can find more information here: http://www.javaworld.com/community/node/7622



来源:https://stackoverflow.com/questions/10312159/generate-java-classes-with-jaxb-from-a-dtd-file-how-can-i-modify-the-dtd

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!