XML 태그의 사용자 정의 기능은 매우 강력합니다. 예를 들어, 이 기사에서 설명할 DTD(Document 유형 정의)는 사람들에게 일종의 객체지향같은 느낌인데, XML
DTD란 무엇인가
에서 DTD 파일 형식 정의를 전체적으로 분석해 보겠습니다. DTD의 전체 이름은 Document Type Definition입니다. XML 파일 구조를 지정하고 XML 파일에 대한 구문과 규칙을 제공하는 파일 정의 형식입니다. DTD에서 XML 파일의 구조를 정의한 다음 DTD 선언에 따라 XML 파일을 작성합니다. 프로그래밍 언어의 함수 정의와 같습니다. 함수를 사용할 때는 함수 선언 형식에 따라 인용해야 합니다.
2. DTD 상세 설명
1. 예시 상세 설명
1.1 DTD 선언 시작문
(1) 내부 선언:
(2) 외부 선언:
외부 선언에는 다양한 형식이 있으며 주로 SYSTEM 유형과 PUBLIC 유형 파일로 구분됩니다.
SYSTEM: 작성자나 조직이 작성한 많은 XML 문서 중 일반적인 DTD입니다.
PUBLIC: 권위 있는 조직에서 개발하고 특정 산업 또는 공공 용도로 제공되는 DTD입니다.
1.2 기타선언
(1) 요소:
<?xml version='1.0' encoding='utf-8'?> <!-- 声明内部DTD --> <!DOCTYPE 影片目录[ <!ELEMENT 影片目录 (影片)+> <!-- 声明XML顶层元素的子元素“影片”,“+”表示有一个或多个影片子元素 --> <!ELEMENT 影片 (片名,主演,导演,简介)> <!-- 声明“影片”元素的子元素 --> <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED> <!-- 声明“影片”元素的属性,两属性分别为“类别”和“年份”,CDATA说明属性的类型为字符型 --> <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗"> <!-- 实体的声明,类型为字符型,在下面使用“&实体名称;”直接引用 --> <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争"> <!ELEMENT 片名 (#PCDATA)> <!ELEMENT 主演 (#PCDATA)> <!ELEMENT 导演 (#PCDATA)> <!ELEMENT 简介 (#PCDATA)> ]> <!-- 由DTD获得的XML --> <影片目录> <影片 类别="武侠" 年份="2008"> <片名>十面埋伏</片名> <主演>刘德华、金城武、章子怡</主演> <导演>张艺谋</导演> <简介>&十面埋伏;</简介> </影片> <影片 类别="武侠" 年份="2006"> <片名>霍元甲</片名> <主演>李连杰</主演> <导演>于仁泰</导演> <简介>&霍元甲;</简介> </影片> </影片目录>
(2) 속성 목록:
<!ELEMENT element_name element_definition>
(3) 엔터티
내부
일반:
매개변수:
외부
일반:
매개변수:
2. 내용에 대한 자세한 설명
2.1 요소 선언
몇 가지 특별한 사항이 있습니다. 요소 선언에서 요소 선언과 하위 요소의 발생 횟수, 선택성 및 혼합 유형은 프로그래밍 언어의 산술 및 논리 연산자 와 유사합니다. 다음은 여러 요소가 있는 DTD의 예입니다.
<!ATTLIST Element_Name Attribute_Name Type [added_declare] Attribute_Name Type [added_declare] ...... >
요소 선언의 기본 구문을 더 깊이 이해하려면 이 맵을 다운로드하세요.
2.2 이름 충돌
때때로 복잡한 XML 문서에 동일한 이름을 가진 요소가 나타나는 경우가 있습니다. 이러한 현상을 방지하기 위해 네임스페이스 와 접두사 식별자를 사용합니다.
2.2.1 네임스페이스
xmlns를 사용하여 네임스페이스를 소개하고 해당 공간에 어떤 부분이 속하는지 사용자에게 알려줍니다. 기능 면에서 다른 프로그래밍 언어의 네임스페이스와 다소 유사하여 요소의 고유성을 보장하고 충돌을 방지합니다.
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE 影片目录 [ <!ELEMENT 影片目录 (影片,其它,说明)+> <!-- 使用“+”号表明影片目录中的子元素出现至少一次 --> <!ELEMENT 其它 EMPTY> <!-- 使用EMPTY关键字声明空元素 --> <!ELEMENT 说明 ANY> <!-- 使用ANY关键字声明任何内容的元素 --> <!ELEMENT 影片(片名,主演,导演,简介)> <!-- 含有子元素的元素声明格式 --> <!ATTLIST 影片 名称 ID #FIXED "十面埋伏" 类别 CDATA "动作" 年份 CDATA #REQUIRED 票房 CDATA #IMPLIED > <!-- 属性声明 --> <!ENTITY introduction "漫天大雪,三人在雪中决斗"> <!ELEMENT 片名(#PCDATA)> <!ELEMENT 主演(#PCDATA)> <!ELEMENT 导演(#PCDATA)> <!ELEMENT 简介(#PCDATA)> ]>
역할: 요소와 속성을 표준화하고 고유 식별자를 부여하여 요소 이름에 충돌이 없는지 확인하고 해당 출처를 명확히 합니다.
2.2.2 접두사 식별자
현재 요소나 속성이 어떤 DTD에서 유래하는지 고유하게 구분하려면 요소 이름과 속성 이름 앞에 식별자를 추가합니다. 이는 네임스페이스와 함께 사용되는 경우가 많습니다. 위의 예에서는
3. 엔터티 상세 설명
요소가 있는데 왜 엔터티를 소개해야 하나요? 둘을 구별하려면 먼저 엔터티 도입의 목적을 살펴봐야 합니다. 엔터티 메커니즘은 다양한 유형의 데이터를 XML 문서에 통합하기 위한 엄청난 시간 절약 도구입니다. 객체지향 추상 클래스와 같이 자주 사용되는 객체를 하나의 엔터티로 추상화하고, 중복을 피하면서 어디서 사용하든 직접 참조할 수 있습니다.
자세히
(1)은 입력할 수 없는 문자를 대체합니다. 키보드에는 26개의 문자와 간단한 구두점만 있고, 문자 집합 에는 입력할 수 없는 다양한 기호가 많이 있습니다. 입력했습니다. 키보드로 입력했습니다.
(2) < 등과 같이 xml 사양 예약어와 충돌하는 일부 콘텐츠를 바꿉니다.
(3) 반복되는 텍스트의 큰 단락을 교체합니다.
엔티티 참조는 참조 위치에 따라 내부 참조와 외부 참조, 참조 내용에 따라 일반 참조와 매개변수 참조의 두 가지 유형으로 구분됩니다. 외부 엔터티 참조의 예를 살펴보겠습니다.
목록 1: "2.dtd" 선언
<?xml version="1.0" encoding='utf-8'?> <影片 xmlns:h='http://www.abc.edu' xmlns:c='http://www.123.edu'><!-- 使用xmlns:来引用命名空间 --> <db> <h:table>werer</h:table> <!-- 告诉用户,此table是在http://www.abc.edu中定义的 --> <c:table>fdfdsfsdf</c:table> <!-- 告诉用户,此table是在http://www.123.edu中定义的 --> </db> </影片>
목록 2: 영화 리뷰 내용 .xml
<!-- 声明外部DTD,并保存为2.dtd --> <!ELEMENT 影片目录 (影片)+> <!ELEMENT 影片 (片名,主演,导演,简介)> <!ATTLIST 影片 类别 CDATA "动作" 年份 CDATA #REQUIRED> <!ENTITY 十面埋伏 "漫天大雪,三人在雪中决斗"> <!ENTITY 霍元甲 "民族英雄,与西方帝国主义抗争"> <!ELEMENT 片名 (#PCDATA)> <!ELEMENT 主演 (#PCDATA)> <!ELEMENT 导演 (#PCDATA)> <!ELEMENT 简介 (#PCDATA)> <!ENTITY filmcomment SYSTEM "影评.xml"> <!-- 引用外部通用实体,文件名称为“影评.xml” -->
목록 3: dtd를 사용하는 xml 파일의 콘텐츠.
<?xml version="1.0" encoding='utf-8'?> <影评> 这些影评都是由XXX公司出品,值得观看! </影评>
목록 3: dtd를 사용하는 xml 파일의 콘텐츠.
<?xml version="1.0" encoding='utf-8'?> <影评> 这些影评都是由XXX公司出品,值得观看! </影评>
목록 4: IE8에서 목록 3을 연 후의 내용
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE 影片目录 (View Source for full doctype...)> - <影片目录> - <影片 类别="武侠" 年份="2008"> <片名>十面埋伏</片名> <主演>刘德华、金城武、章子怡</主演> <导演>张艺谋</导演> <简介>漫天大雪,三人在雪中决斗</简介> </影片> - <影片 类别="武侠" 年份="2006"> <片名>霍元甲</片名> <主演>李连杰</主演> <导演>于仁泰</导演> <简介>民族英雄,与西方帝国主义抗争</简介> </影片> <影评>这些影评都是由XXX公司出品,值得观看!</影评> </影片目录>
内部和外部很容易理解,主要看一般和参数两种引用的区别。
1.参数实体
清单1:test.dtd,在此该内容单独存在了一个dtd文件中是因为在内部DTD子集中。
参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现。然而,对于外部DTD子集,则没有这个限制。
<!-- 声明外部DTD,并保存为test.dtd --> <!-- 个人信息实体声明的是参数类型的,可以再各个元素中共同使用该参数 --> <!ENTITY % 个人信息 "(姓名,性别,出生日期)"> <!ELEMENT 学生信息 %个人信息;> <!ELEMENT 教师信息 %个人信息;> <!ELEMENT 员工信息 %个人信息;>
清单2:学校信息.xml文件,引用了外部的test.dtd文件
<?xml version='1.0' encoding='utf-8'?> <!-- 学校信息.xml文件 --> <!-- 引用外部DTD --> <!DOCTYPE 学校信息 SYSTEM './test.dtd'> <!-- 由DTD获得的XML --> <学校信息> <学生信息> <姓名>张三</姓名> <性别>男</性别> <出生日期>2013-10-12</出生日期> </学生信息> <教师信息> <姓名>张三</姓名> <性别>男</性别> <出生日期>2013-10-12</出生日期> </教师信息> <员工信息> <姓名>张三</姓名> <性别>男</性别> <出生日期>2013-10-12</出生日期> </员工信息> </学校信息>
清单3:使用IE8打开清单2的内容后
<?xml version="1.0" encoding="utf-8" ?> - <!-- 声明内部DTD --> <!DOCTYPE 学校信息 (View Source for full doctype...)> - <!-- 由DTD获得的XML --> - <学校信息> - <学生信息> <姓名>张三</姓名> <性别>男</性别> <出生日期>2013-10-12</出生日期> </学生信息> - <教师信息> <姓名>张三</姓名> <性别>男</性别> <出生日期>2013-10-12</出生日期> </教师信息> - <员工信息> <姓名>张三</姓名> <性别>男</性别> <出生日期>2013-10-12</出生日期> </员工信息> </学校信息>
2. 一般实体
可在XML元素中加以引用,也可以在DTD中引用,但参数实体只能在DTD中引用,并且通常情况下只能在外部DTD文档中引用。
3. 对比升华
参数实体与一般实体的区别如下:
(l)在定义参数实体时,实体名前必须加一个“%”号。
(2)参数实体引用以“%”开始,而不是一般实体引用的“&”。
(3)参数实体的内容不仅可以包含文本,还可以包含标记。
(4)参数实体只能应用于DTD,而不能在文档本体中引用。即参数实体只能用来构成DTD的内容,而不能构成文档内容。
(5)参数实体只能在外部DTD文档中使用,无法应用于内部DTD。
外部参数实体与外部一般实体的区别如下:
(1)外部参数实体应用于独立的DTD文档,外部一般实体应用于XML文档。
(2)外部参数实体应用于将多个独立的DTD文档组合为一个大的DTD文档,外部一般实体用于将多个独立的XML文档组合成一个大的XML文档。
四、验证XML文件的合法性
DTD定义了XML文件的使用格式,它从结构和形式上限制了XML文档,通过引用DTD可以形成统一的规范化的XML文档,另外通过使用实体简化了DTD和XML文档的内容。使用DTD验证的XML文档才能称为规范化文档,那如何验证所写的XML文档是否符合DTD的规范呢。通过如下的代码串:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.xml.sax.InputSource; public class ValidateDTD { public static void main(String[] args){ //在验证前需要把需要验证的XML和规范DTD包含在jar中 try{ DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //创建一个文档构造工厂 dbf.setValidating(true); DocumentBuilder builder=dbf.newDocumentBuilder(); builder.parse(new InputSource("xml-2-2.xml")); //需要验证的XML名称 }catch(Exception e){ e.printStackTrace(); } } }
上面代码中的类和结构主要完成了XML文档的解析,并且在解析之前验证当前XML文件是否符合某个DTD的定义。在上面的代码运行前需要将需要验证的XML和提供规范化的DTD文档引入到当前ValidateDTD项目中,后运行上面的代码实例,该项目会在项目文件中自动查找规范的DTD,然后验证xml文件。
五、结语
至此,有关文件定义格式的内容已经基本上讨论了一遍,从最初的元素声明到复杂多变的实体类型,DTD的引入无疑为XML的使用指定了一个统一的标准,这种标准是由提供方规定好,使用方遵守的一种规则,并在最后讨论了如何验证引用DTD的XML合法与否。另外描述XML文档结构的不仅仅只有DTD,DTD是一种早期的定义格式,它有很多缺点,如不支持数据类型,不易于扩展等,为了避免这种缺点后来又引入了Schema,它是DTD的继任者,下篇博客将着重讨论Schema。
위 내용은 XML로 완전히 구문 분석된 DTD 문서 유형 정의를 위한 샘플 코드(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!