XML文档篇:认识DTD(一)
新的一周从学习本地化的文档格式开始叭~
隔了好久的源文档解析,现在继续叭~继续跟大家分享XML文档~
今天分享DTD。
再来强调一遍我写源文档解析系列的初衷:
不是为了让大家做一个程序猿(媛),而是想让大家学会判断:
“这个源文档的格式到底有没有问题?能不能翻译?”
“如果能翻译,怎么翻译!”
OK,正文来了~
前面关于XML文档,我们前面通过两篇文章介绍了XML是什么:
再来复习XML长什么样子:
图1 XML文本截图
在这里,
第一行的
<?xml version="1.0" encoding="utf-8"?>
是声明语句。从第二行开始,
<sample>
就是根元素了,根元素之间还有子元素<document>
元素必须要有完整标签对:
<document></document>
或者独立标记要完整标记:<button/>
元素可能有属性:value就是button的属性;
标签对之间的文本是我要翻译的内容;标签属性值也要判断到底要不要翻译;
但是有时候,我们也会收到这样的文件包:文件包里既有xml文档,又有一个dtd文档。
图2 翻译包截图
如果打开其中一个XML文档,是长这样的:
图3 含有DTD的原文截图
咦,细心的同学会发现:似乎和图1的XML不一样哦~
这个文档多了第二行:
<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">
——其实,这是DOCTYPE 声明的内容,用来告诉你:“这是这个文档类型是一个PartPage,引用的是外部的partpage.dtd文档”。
咦,细心的同学更会发现:这个第二行的最后"partpage.dtd"不就是文件包中的后缀名为*.dtd的partpage.dtd文档嘛!
是的!如果你打开这份*.dtd文档(其实这就是一个ASCII的文本文件)——也就是包含 DTD 的 "partpage.dtd" 文件,长这样:
图4 DTD声明
这就是含有DTD的XML文档!那,DTD是什么鬼?
01 定义
DTD 是英文Document Type Definition的首字母缩写,中文意思为“文档类型定义”。
通过DTD我们可以验证XML是“合法”,也就是说:验证你的XML文档结构是否拥有正确语法,或者你可以理为是否符合要求。
如果你不想知道这是什么,也可以直接往下划,直接看如何翻译含有DTD的XML,找到方法论。
那么问题来了:
正确语法是什么?或者说:要求是什么?
02 DTD构成
首先,在原XML中已经声明了:
<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">
,
你可以理解为自我介绍:“Hi 我引入partpage文档;”
图5 DOCTYPE声明
我们看一下DTD的这个构成:
图6 DTD文档
2.1 元素
在 DTD 中,元素通过ELEMENT来进行声明。语法如下:
<!ELEMENT 元素名称 (元素内容)>
所以我们看第2行,说明了:
根元素PartPage
元素应该包含哪几个子元素,这里有VendorInfo
、PartInfo
、Description
、Service
等。
所以你会发现,在图7右侧的正文XML中就是按照这几个元素及关系在定义的。
图7 PartPage元素
再比如图8 第7行就定义了:父元素<VendorInfo>
应该包含Name
、Contact
两个子元素。
图8 VendorInfo元素
那图7和图8 左侧的dtd文档的第二行中,子元素名右上角的星号(*)、加号(+)号等等是什么意思呢?
图9 星号或加号等正则
类似我们前面讲的正则的符号表示,详见:正则篇(一):认识正则表达式:
星号(*)表示该元素出现零次或多次。
理解了星号,加号就很容易理解了:加号(+)表示该元素至少出现一次,也就是一次或多次。
所以,在上图9中,右侧的XML文件有VendorInfo
、PartInfo
、Description
、Service
元素,但是没有<GeneralProcs>
或者<Operation>
等元素。
但是我们再图10,在右侧的XML中就有<GeneralProcs>
元素,但是却没有Service
元素。
图10 PartPage的子元素
2.2 属性
在 DTD 中,属性通过 ATTLIST 声明来进行声明。语法如下:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
比如这里的第100行:
图11 DTD属性声明
Item元素包含了 priority 属性
<priority>
属性类型是CDATA。关于CDATA,参见:翻译包含HTML样式的XML文档 (CDATA篇)该元素默认值
#IMPLIED
,表示priority 属性不是必需的。所以第53行的Item有priority属性,但是像69行、74行、79行就没有priority属性。
更多属性类型和默认值你可以去网络上搜索啦~
2.3 实体
前面我们讲过XML的实体,详见:翻译包含HTML样式的XML文档(实体篇)。
在 DTD 中,实体通过 ENTITY 来进行声明:
<!ENTITY 实体名称 "实体的值">
,或者<!ENTITY 实体名称 SYSTEM "URI/URL">
。
因为这个文档中没有,所以我不介绍了,大家需要去网络上自查啦~
如果你已经懂了DTD是什么,特别好~我们下篇继续讲DTD怎么翻译~
当然,emmmm听不懂。没关系,真的没关系,其实定义和构成也不是很重要~
(说实话我也看得不是很懂,写这篇文档之前我也是查各种资料、问我各种搞开发的朋友们~感谢感谢!)
但是我们是搞翻译的嘛!又不是搞编程的!我只要知道文档怎么翻译就好了!
我真的努力讲惹,如果我讲不明白,那我真的尽力了~你可以从网上找找其它关于DTD的资料~
所以,我们下一篇文章讲方法论。
好啦今天内容先到这里,再见啦~
往期精选
行业报告和标准系列:
XML文档解析系列:
如何翻译多语言XML文档?(游戏本地化与APP本地化常见原文)