2012-04-25 106 views
4

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

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生成的类,我得到了以下的:

  • 的ObjectFactory
  • 内容

在内容类中的方法中检索所有的个人和群体是

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

,请问有什么可以在DTD文件改变,因此Java类的产生将使personsgroups分开在Content java类中,因此要检索所有人员和组将分别拨打Content.getPersons()Content.getGroups()

+0

不认为possible.Take走进一看this.https://forums.oracle.com/forums/thread.jspa线程ID = 1624187 – mavrav 2012-04-25 08:49:30

+0

它肯定是可能。 http://www.javaworld.com/community/node/7622 – surya 2013-02-17 22:59:50

回答

4

在他的回复中,mavrav似乎告诉我们DTD是不可能的。我不太清楚如何使用DTD。 但是,如果可以,请在XML模式下翻译您的DTD。

我试着用这个玛:

<?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 

,这让我的内容类下面的代码:

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

谢谢你的回复!这非常有帮助! XSD是要走的路! – Rox 2012-04-27 07:49:09

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

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

,你可以在这里找到更多的信息: http://www.javaworld.com/community/node/7622

+0

我不认为那篇文章回答@Rox的问题。他的问题是,当从DTD生成Java代码时,只要元素可以容纳多种类型的数据,xjc就会创建一个List ,混合不同类别的对象。我也有同样的问题。本文仅解释如何使用xjc从DTD生成Java代码,甚至没有提及这种特殊情况。 – lpacheco 2015-05-16 15:50:53