`
rmzdb
  • 浏览: 81375 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

【原】dtd/xsd 这点事

阅读更多

dtd/xsd 这点事

工作多年,发现以前不怎么在乎的东西,越发是大有文章。值得我们去深入学习下。最近公司的时间比较宽松,想把以前只会用的东西,继续学习下。才发现不懂的东西还是比较多的。本着“知其然,知其所以然”的态度,这里记录下一些文字。

 

今天在看hibernate源码的时候,发现hibernate包下有个hibernate-configuration-3.0.dtd文件,而spring关于配置方面的验证文件却是spring-beans-3.0.xsd文件那么dtd文件跟xsd文件之间有什么不同呢?下面介绍一下DTD,XSD的区别

 

1.DTD(Documnet Type Definition)
DTD即文档类型定义,是一种XML约束模式语言,是XML文件的验证机制,属于XML文件组成的一部分。
DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。 

 

一个 DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。
2.XSD(XML Schemas Definition) 
XSDXML结构定义,XML Schema描述了XML文档的结构。
可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其要求。XML Schema本身是一个XML文档,它符合XML语法结构。可以用通用的XML解析器解析它。
一个XML Schema会定义:文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认 和固定值。

 

对比下

 

DTD文件

XSD文件

支持对XML文件的验证?

支持

支持

XML语法编码?

不是

是的,可以像其他XML文件一样解析和处理

可扩展吗?

不可

可以

支持命名空间吗?

不可

可以

可扩充数据类型?

只提供非常有限的数据类型 

可以

可见XSD要比DTD文件丰富。

 

 

实例说明:

一个XML文档:

 

<?xml version="1.0"?>
<!-- 本文档根元素为gridbag, 其中验证文档为gridbag.dtd -->
<!DOCTYPE gridbag SYSTEM "gridbag.dtd">
<gridbag>
	<row>
		<cell anchor="EAST">
			<bean>
				<class>javax.swing.JLabel</class>
				<property>
					<name>text</name>
					<value>
						<string>Face:</string>
					</value>
				</property>
			</bean>
		</cell>
		<cell fill="HORIZONTAL" weightx="100">
			<bean id="face">
				<class>javax.swing.JComboBox</class>
			</bean>
		</cell>
		<cell gridheight="4" fill="BOTH" weightx="100" weighty="100">
			<bean id="sample">
				<class>javax.swing.JTextArea</class>
				<property>
					<name>text</name>
					<value>
						<string>The quick brown fox jumps over the lazy dog</string>
					</value>
				</property>
				<property>
					<name>editable</name>
					<value>
						<bolean>false</bolean>
					</value>
				</property>
				<property>
					<name>lineWrap</name>
					<value>
						<boolean>true</boolean>
					</value>
				</property>
				<property>
					<name>border</name>
					<value>
						<bean>
							<class>javax.swing.border.EtchedBorder</class>
						</bean>
					</value>
				</property>
			</bean>
		</cell>
	</row>
	<row>
		<cell gridwidth="2" weighty="100">
			<bean id="bold">
				<class>javax.swing.JCheckBox</class>
				<property>
					<name>text</name>
					<value>
						<string>Bold</string>
					</value>
				</property>
			</bean>
		</cell>
	</row>
	<row>
		<cell gridwidth="2" weighty="100">
			<bean id="italic">
				<class>javax.swing.JCheckBox</class>
				<property>
					<name>text</name>
					<value>
						<string>Italic</string>
					</value>
				</property>
			</bean>
		</cell>
	</row>
</gridbag>

 

 DTD文件描述

<!ELEMENT gridbag (row)*>  <!--根元素是gridbag,可以多个子元素row-->
<!ELEMENT row (cell)*>  <!--row下面可以有多个cell子元素 -->
<!ELEMENT cell (bean)> <!--cell元素下只有一个bean元素-->
<!ATTLIST cell gridx CDATA #IMPLIED>  <!--cell有gridx属性,类型为任意文本,如果有特殊字符用相应的替代字符代替(用于属性中),可选-->
<!ATTLIST cell gridy CDATA #IMPLIED> 
<!ATTLIST cell gridwidth CDATA "1"> <!--gridwidhth属性默认为1-->
<!ATTLIST cell gridheight CDATA "1">
<!ATTLIST cell weightx CDATA "0">
<!ATTLIST cell weighty CDATA "0">
<!ATTLIST cell fill (NODE|BOTH|HORIZONTAL|VERTICAL) "NONE"> <!--fill属性有几个可选值,默认为NONE-->
<!ATTLIST cell anchor (CENTER|NORTH|NORTHEAST|EAST|SOUTHEAST|SOUTH|SOUTHWEST|WEST|NORTHWEST) "CENTER">
<!ATTLIST cell ipdx CDATA "0">
<!ATTLIST cell ipady CDATA "0">

<!ELEMENT bean (class, property*)> <!--bean子元素有一个class子元素,多个property子元素-->
<!ATTLIST bean id ID #IMPLIED> <!--bean的id属性是ID类型,也就是唯一性 -->

<!ELEMENT class (#PCDATA)> <!--class元素下面可以只包含文本也可以包含子元素,类似于ANY(用于元素中)-->
<!ELEMENT property (name, value)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT value (int|string|boolean|bean)>
<!ELEMENT int (#PCDATA)>
<!ELEMENT string (#PCDATA)>
<!ELEMENT boolean (#PCDATA)>

XSD文件描述: 

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.mysite.org/schema/mytag"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"
	targetNamespace="http://www.mysite.org/schema/mytag"
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:element name="gridbag" type="GridBagType" /><!--根元素 -->
	<xsd:element name="bean" type="BeanType" />
	<xsd:complexType name="GridBagType">
		<xsd:sequence>
			<xsd:element name="row" type="RowType" minOccurs="0"
				maxOccurs="unbounded" />
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="RowType">
		<xsd:sequence>
			<xsd:element name="cell" type="CellType" minOccurs="0"
				maxOccurs="unbounded" />
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="CellType">
		<xsd:sequence>
			<xsd:element ref="bean"></xsd:element>
		</xsd:sequence>
		<xsd:attribute name="gridx" type="xsd:int" use="optional" />
		<xsd:attribute name="gridy" type="xsd:int" use="optional"></xsd:attribute>
		<xsd:attribute name="gridwidth" type="xsd:int" use="optional"
			default="1"></xsd:attribute>
		<xsd:attribute name="gridheight" type="xsd:int" use="optional"
			default="1" />
		<xsd:attribute name="weightx" type="xsd:int" use="optional"
			default="0" />
		<xsd:attribute name="weighty" type="xsd:int" use="optional"
			default="0" />
		<xsd:attribute name="fill" use="optional" default="NONE">
			<xsd:simpleType>
				<xsd:restriction base="xsd:string">
					<xsd:enumeration value="NONE" />
					<xsd:enumeration value="BOTH" />
					<xsd:enumeration value="HORIZONTAL" />
					<xsd:enumeration value="VERTICAL"></xsd:enumeration>
				</xsd:restriction>
			</xsd:simpleType>
		</xsd:attribute>
		<xsd:attribute name="anchor" use="optional" default="CENTER">
			<xsd:simpleType>
				<xsd:restriction base="xsd:string">
					<xsd:enumeration value="CENTER"></xsd:enumeration>
					<xsd:enumeration value="NORTH" />
				</xsd:restriction>
			</xsd:simpleType>
		</xsd:attribute>
		<xsd:attribute name="ipady" type="xsd:int" use="optional"
			default="0"></xsd:attribute>
		<xsd:attribute name="ipadx" type="xsd:int" use="optional"
			default="0" />
	</xsd:complexType>
	<xsd:complexType name="BeanType">
		<xsd:sequence>
			<xsd:element name="class" type="xsd:string" />
			<xsd:element name="property" type="PropertyType"
				minOccurs="0" maxOccurs="unbounded" />
		</xsd:sequence>
		<xsd:attribute name="id" type="xsd:ID" use="optional"></xsd:attribute>
	</xsd:complexType>
	<xsd:complexType name="PropertyType">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string" />
			<xsd:element name="value" type="ValueType" />
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="ValueType">
		<xsd:choice>
			<xsd:element ref="bean" />
			<xsd:element name="int" type="xsd:int" />
			<xsd:element name="string" type="xsd:string" />
			<xsd:element name="boolean" type="xsd:boolean" />
		</xsd:choice>
	</xsd:complexType>
</xsd:schema>

 

 

Spring中 XSD文件对XML校验:

   见博客另一I篇文章。

 

Herbernate DTD 文件对XML校验:

 

 

      正常的 dom4j 读取 xml 的方式如下:

 

package com.zs.test.xsd;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class DTDExample
{
    public static String fileRealPath = "D:/vingsoft2/clientTest/src/com/zs/test/xsd/";
    
    public static void main(String[] args)
        throws DocumentException, IOException
    {
        
        EntityResolver resolver = new EntityResolver()
        {
            public InputSource resolveEntity(String publicId, String systemId)
                throws SAXException, IOException
            {
                // 这个publicId 没有搞明白? 
                   System.out.println(publicId);
                // file:///D:/vingsoft2/clientTest/src/com/zs/test/xsd/gridbag.dtd
                System.out.println(systemId);
                if (systemId.endsWith("gridbag.dtd"))
                {
                    InputStream in = new FileInputStream(new File(fileRealPath + "gridbag.dtd"));
                    return new InputSource(in);
                }
                return null;
            }
        };
        SAXReader reader = new SAXReader();
        reader.setEntityResolver(resolver); // 负责绑定dtd文件,对xml文件进行校验
         reader.setValidation(true);// 是否需要验证
         Document doc = reader.read(new File(fileRealPath + "MyXml.xml"));
        Element root = doc.getRootElement();
        
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding(doc.getXMLEncoding());
        XMLWriter writer = new XMLWriter(new FileOutputStream(fileRealPath + "haha.xml"), format);
        writer.write(doc);
        writer.close();
    }
}

 

  Hibernate在读取配置文件,进行XML校验的时候,主要用到了三个类:

 org.hibernate.cfg.Configuration

 org.hibernate.util.XMLHelper

 org.hibernate.util.DTDEntityResolver

URL定义 写道
private static final String URL = "http://hibernate.sourceforge.net/"

 

hibernate对校验文件的绑定 写道

 

public InputSource resolveEntity (String publicId, String systemId) {
		if ( systemId!=null && systemId.startsWith(URL) ) {			
			log.debug("trying to locate " + systemId + " in classpath under org/hibernate/");
			// Search for DTD
			String path = "org/hibernate/" + systemId.substring( URL.length() );
			InputStream dtdStream = resourceLoader==null ? 
					getClass().getResourceAsStream(path) :
					resourceLoader.getResourceAsStream(path);
			if (dtdStream==null) {
				log.debug(systemId + " not found in classpath");
				if ( systemId.substring( URL.length()).indexOf("2.0")>-1 ) {
					log.error("Don't use old DTDs, read the Hibernate 3.x Migration Guide!");
				}
				return null;
			}
			else {
				log.debug("found " + systemId + " in classpath");
				InputSource source = new InputSource(dtdStream);
				source.setPublicId(publicId);
				source.setSystemId(systemId);
				return source;
			}
		}
		else {
			// use the default behaviour			
			return null;
		}
	}

 

参考:

http://lg-asus.iteye.com/blog/1517942

http://www.w3school.com.cn/dtd/

http://www.w3school.com.cn/schema/index.asp

分享到:
评论

相关推荐

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    然后打开eclipse -&gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你放dtd文件的位置例如:‪D:\mybatis\mybatis-3-config.dtd)-&gt;Key(如果更改config,此处应该是:-//...

    DTD文件和XSD文件

    3. `web-app_2_3.dtd`和`web-app_2_4.xsd`:这两个文件定义了Servlet容器(如Tomcat)中Web应用程序部署描述符`web.xml`的结构。`web.xml`是所有Servlet和Filter的注册中心,它定义了应用程序的初始化参数、安全配置...

    xml dtd xsd 标准格式

    DTD(Document Type Definition)和XSD(XML Schema Definition)是两种用来定义XML文档结构和数据类型的规范。 1. XML DTD:DTD是XML的早期规范,用于定义XML文档的元素、属性以及它们之间的关系。它通过一系列...

    在Eclipse中导入dtd和xsd文件,使XML自动提示

    这需要我们将相关的DTD(Document Type Definition,文档类型定义)或XSD(XML Schema Definition,XML模式定义)文件导入到项目中,以便IDE能够理解XML文件的结构和约束,并提供相应的代码补全和验证服务。...

    xm-DTD&XSD;测试文件

    在“test-DTD&XSD”这个压缩包中,可能包含以下内容: 1. DTD文件:比如`example.dtd`,它定义了XML文档的结构和元素规则。 2. XSD文件:如`schema.xsd`,提供了更高级的结构和数据类型定义。 3. 对应的XML文件:...

    XML转XSD\DTD工具

    XML转XSD\DTD工具 W3C XML Schema XSD 工具

    hibernate-dtd-xsd约束文件

    4. **版本兼容性**:随着Hibernate版本的升级,DTD和XSD文件也会相应更新,以适应新的特性和功能,这使得迁移至新版本变得更加平滑。 5. **可扩展性**:通过定义自定义元素和属性,开发者可以扩展Hibernate的默认...

    XML DTD XSD,解压后有14M

    在"老师上课的例子"这个压缩包中,可能包含了一些使用XML、DTD和XSD的实例,可能是关于如何定义和使用这些技术的具体示例。这些例子可能涉及了XML的元素、属性和命名空间,DTD的元素声明、属性声明和实体引用,以及...

    WEB编程技术_css.dtd.xsd.xml及报告封面的xml编写

    在"实验3"这个子文件中,很可能是关于如何结合这些技术的实践练习,可能包含创建CSS样式表来美化XML数据的显示,编写XML文档并用DTD或XSD进行验证,以及如何将这些元素整合到实验报告的XML封面中。通过这样的练习,...

    通讯录源码XML+CSS+DTD+XSD

    标题中的“通讯录源码XML+CSS+DTD+XSD”揭示了这是一个使用XML(可扩展标记语言)、CSS(层叠样式表)以及DTD(文档类型定义)和XSD(XML Schema定义)来构建的通讯录应用的源代码。下面我们将深入探讨这些技术及其...

    XML的使用方式示列(xsl、xsd、dtd等)

    本示例将深入探讨XML的使用方式,包括XSL、XSD和DTD等关键组件。 1. **XML基本结构** XML文档由一系列元素构成,每个元素通过标签括起来,例如 `&lt;element&gt;` 和 `&lt;/element&gt;`。元素可以包含其他元素、文本、属性...

    Dubbo配置文件依赖的本地DTD

    在"DTD-xsd.zip"这个压缩包文件中,可能包含了Dubbo配置文件所需的一系列DTD和XML Schema Definition (XSD) 文件。XSD是另一种更现代且功能更强大的XML语法规则定义工具,它可以提供更严格的类型检查和数据约束。与...

    dwr20.dtd约束文件

    dwr20.dtd约束文件。 &lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd" &gt;

    mybatis-dtd约束文件

    在这个特定的场景中,我们关注的是"Mybatis-dtd",即MyBatis框架中使用的DTD(Document Type Definition)约束文件。 DTD是一种用于定义XML文档结构的机制,它定义了元素、属性以及它们之间的关系。在MyBatis的上下...

    dtd_xsd.zip

    其次解决编译依赖问题的...在问题得到解决后,你自认为一切都已经步入正轨,却突然发现刚刚提交的新代码又轻轻松松地产生了编译依赖问题并且这样的代码还越来越多,这个时候你恐怕只能发出“人间正道是沧桑”的感慨了。

    Eclipse XML自动提示DTD文件下载

    这通常涉及到Eclipse的XML编辑器和XML Schema/DTD的支持。 XML是用于结构化数据交换的一种标记语言,而DTD则定义了XML文档的结构和元素规则。在编写XML文件时,如果我们有对应的DTD文件,Eclipse可以提供代码补全、...

    需要的DTD文件.rar

    "config"这个文件名可能是压缩包内的一个配置文件,它可能包含了与DTD相关的配置信息,如DTD的路径、默认设置或者解析器的设置等。配置文件通常用于定制程序的行为,以适应不同的环境或需求。 在实际应用中,开发者...

    命名空间 dtd文件、Schema文件 (xsd)文件的引入1

    命名空间、DTD 文件和 Schema 文件的引入 在 XML 文档中,命名空间(Namespace)是一种机制,用于区分不同标签的来源。命名空间可以定义在根节点中,并且可以使用前缀来表示完整的域名内容。 1. 命名空间的定义 ...

Global site tag (gtag.js) - Google Analytics