【问题标题】:Generate Java classes with JAXB from a DTD file - how can I modify the DTD?从 DTD 文件生成带有 JAXB 的 Java 类 - 如何修改 DTD?
【发布时间】:2012-05-05 22:20:19
【问题描述】:

我想使用 JAXB 从 dtd 文件生成 Java 类。

dtd 看起来像这样:

<!--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) >

当使用 JAXB 生成类时,我得到以下:

  • 对象工厂
  • 内容
  • 人员

在 Content 类中,检索所有人员和组的方法是

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

我可以在 dtd 文件中更改什么,以便生成 Java 类将使 personsgroupsContent java 类中分离,因此要检索所有人员和组将是分别致电Content.getPersons()Content.getGroups()

【问题讨论】:

标签: java xml jaxb dtd


【解决方案1】:
xjc -dtd -d generatedsrc -p com.examples log4j.dtd

将在目录 generatedsrc 中生成类,使用的包将是 com.examples。

您可以在此处找到更多信息: http://www.javaworld.com/community/node/7622

【讨论】:

  • 我不认为那篇文章回答了@Rox 的问题。他的问题是,当从 DTD xjc 生成 Java 代码时,只要一个元素可以保存多种类型的数据,就会创建一个 List,混合不同类的对象。我也有同样的问题。这篇文章只解释了如何使用 xjc 从 DTD 生成 Java 代码,甚至没有提到这种特殊情况。
【解决方案2】:

在他的回答中,mavrav 似乎表明使用 DTD 是不可能的。我不太清楚如何使用DTD。 但是,如果可以,请将您的 DTD 转换为 XML 模式。

我试过这个 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>

在我使用以下 cmd 生成 Java 类之后:

xjc -p com.mypackage schema.xsd

它为我提供了 Content 类的以下代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多