文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

我们先来看一下一个典型 的DTD文档定义:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

新建个文件post.dtd

touch post.dtd

然后把刚才的文件定义写入文件。

xjc是一个java命令行工具,用户把XML格式定义的数据结构生成生成 JAXB 类。只要你安装了JDK就会有这个工具

我们先来看看xjc具有哪些功能

用法: xjc [-options ...] <schema file/URL/dir/jar> ... [-b <bindinfo>] ...
如果指定 dir, 将编译该目录中的所有模式文件。
如果指定 jar, 将编译 /META-INF/sun-jaxb.episode 绑定文件。
选项:
  -nv                :  不对输入模式执行严格验证
  -extension         :  允许供应商扩展 - 不严格遵循
                        JAXB 规范中的兼容性规则和应用程序 E.2
  -b <file/dir>      :  指定外部绑定文件 (每个 <file> 必须具有自己的 -b)
                        如果指定目录, 则将搜索 **/*.xjb
  -d <dir>           :  生成的文件将放入此目录中
  -p <pkg>           :  指定目标程序包
  -httpproxy <proxy> :  设置 HTTP/HTTPS 代理。格式为 [user[:password]@]proxyHost:proxyPort
  -httpproxyfile <f> :  作用与 -httpproxy 类似, 但在文件中采用参数来保护口令
  -classpath <arg>   :  指定查找用户类文件的位置
  -catalog <file>    :  指定用于解析外部实体引用的目录文件
                        支持 TR9401, XCatalog 和 OASIS XML 目录格式。
  -readOnly          :  生成的文件将处于只读模式
  -npa               :  禁止生成程序包级别注释 (**/package-info.java)
  -no-header         :  禁止生成带有时间戳的文件头
  -target (2.0|2.1)  :  行为与 XJC 2.0 或 2.1 类似, 用于生成不使用任何 2.2 功能的代码。
  -encoding <encoding> :  为生成的源文件指定字符编码
  -enableIntrospection :  用于正确生成布尔型 getter/setter 以启用 Bean 自测 apis 
  -contentForWildcard  :  为具有多个 xs:any 派生元素的类型生成内容属性
  -xmlschema         :  采用 W3C XML 模式处理输入 (默认值)
  -relaxng           :  采用 RELAX NG 处理输入 (实验性的, 不支持)
  -relaxng-compact   :  采用 RELAX NG 简洁语法处理输入 (实验性的, 不支持)
  -dtd               :  采用 XML DTD 处理输入 (实验性的, 不支持)
  -wsdl              :  采用 WSDL 处理输入并编译其中的模式 (实验性的, 不支持)
  -verbose           :  特别详细
  -quiet             :  隐藏编译器输出
  -help              :  显示此帮助消息
  -version           :  显示版本信息
  -fullversion       :  显示完整的版本信息


扩展:
  -Xinject-code      :  inject specified Java code fragments into the generated code
  -Xlocator          :  enable source location support for generated code
  -Xsync-methods     :  generate accessor methods with the 'synchronized' keyword
  -mark-generated    :  mark the generated code as @javax.annotation.Generated
  -episode <FILE>    :  generate the episode file for separate compilation
  -Xpropertyaccessors :  Use XmlAccessType PROPERTY instead of FIELD for generated classes

默认情况下xjc是吧.xsd格式的数据生成JAXB类,如果要使用.dtd生成JAXB类,需要使用参数`-dtd`

xjc -dtd post.dtd

然后生成了如下两个类:

generated/Note.java
generated/ObjectFactory.java

我们来看看生成的类Note.java

//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.8-b130911.1802 生成的
// 请访问 <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2017.09.30 时间 04:04:53 PM CST 
//


package generated;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "to",
    "from",
    "heading",
    "body"
})
@XmlRootElement(name = "note")
public class Note {

    @XmlElement(required = true)
    protected String to;
    @XmlElement(required = true)
    protected String from;
    @XmlElement(required = true)
    protected String heading;
    @XmlElement(required = true)
    protected String body;

    /**
     * 获取to属性的值。
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getTo() {
        return to;
    }

    /**
     * 设置to属性的值。
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setTo(String value) {
        this.to = value;
    }

    /**
     * 获取from属性的值。
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getFrom() {
        return from;
    }

    /**
     * 设置from属性的值。
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setFrom(String value) {
        this.from = value;
    }

    /**
     * 获取heading属性的值。
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getHeading() {
        return heading;
    }

    /**
     * 设置heading属性的值。
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setHeading(String value) {
        this.heading = value;
    }

    /**
     * 获取body属性的值。
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getBody() {
        return body;
    }

    /**
     * 设置body属性的值。
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setBody(String value) {
        this.body = value;
    }

}

这样一个标准的JAXB类就生成好了,可以序列化为xml文档了。

results matching ""

    No results matching ""