Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JAXB从DTD文件生成Java类-如何修改DTD?_Java_Xml_Jaxb_Dtd - Fatal编程技术网

使用JAXB从DTD文件生成Java类-如何修改DTD?

使用JAXB从DTD文件生成Java类-如何修改DTD?,java,xml,jaxb,dtd,Java,Xml,Jaxb,Dtd,我想使用JAXB从dtd文件生成Java类 dtd如下所示: <!--Contents--> <!ELEMENT persons (header, content) > <!ELEMENT groups (header, content) > <!--Header--> <!ELEMENT header (version) > <!ELEMENT version(#PCDATA) > &l

我想使用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生成类时,我会得到以下类:

  • 对象工厂
  • 内容
  • 团体
  • 团体
在内容类中,检索所有人员和组的方法是

public List<Object> getPersonOrGroup() {
    if (personOrGroup == null) {
        personOrGroup = new ArrayList<Object>();
    }
    return this.personOrGroup;
}
公共列表getPersonOrGroup(){
if(personOrGroup==null){
personOrGroup=newarraylist();
}
返回this.personOrGroup;
}

dtd文件中有什么我可以更改的吗?这样Java类的生成将使
人员
内容
Java类中分开,因此检索所有人员和组将分别调用
内容.getPersons()
内容.getGroups()

在他的回答中,mavrav似乎告诉我们DTD是不可能的。我不知道如何使用DTD。 但如果可以,请在XML模式中翻译DTD

我试着用这个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>
它为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;
    }
}
@XmlRootElement(name=“content”)
公开课内容{
@XmlElement(必需=true)
受保护名单上的人;
@XmlElement(必需=true)
受保护名单组;
公共列表getPerson(){
if(person==null){
person=newarraylist();
}
把这个人还给我;
}
公共列表getGroup(){
如果(组==null){
组=新的ArrayList();
}
返回此.group;
}
}
将在目录generatedsrc中生成类,使用的包是com.examples

您可以在此处找到更多信息:

不要认为那是可能的。看看这个。它肯定是可能的。谢谢你的回复!那帮了大忙!XSD就是要走的路!我不认为那篇文章回答了@Rox的问题。他的问题是,当从DTD生成Java代码时,只要一个元素可以包含多种类型的数据,xjc就会创建一个列表,混合不同类的对象。我也有同样的问题。本文只解释了如何使用xjc从DTD生成Java代码,甚至没有提到这个特殊情况。
@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;
    }
}
xjc -dtd -d generatedsrc -p com.examples log4j.dtd