标签语言, XML
在魔兽世界插件编写的过程中, 除了Lua, 另一种用到的语言是XML. XML用来在魔兽世界的用户界面中构建图形框架.
XML的全称是eXtensive Markup Language, 和HTML, LaTeX等标签语言类似, 由文本及携带额外信息的标签(tag)构成. 标签可以描述文本的结构, 或者指定文本在屏幕上显示的方式.
例如, 下面是一段HTML代码:
<html>
<head>
<title>My Document</title>
</head>
<body>
<h1>Heading One</h1>
This text is <strong>bold</strong>.
</body>
</html>
HTML可以完全由文本构成, 标签只是在需要的时候指定文本显示的格式. 与此相比, XML则是完全由夹带或不夹带文本的标签构成的结构语言, 所有的标签并不提示文本在屏幕上显示的方式, 而只是体现文本本身的数据结构. 例如下面的XML代码:
<addressbook name="Personal">
<entry>
<firstname>Alice</firstname>
<lastname>Applebaum</lastname>
<phone>+1-212-555-1434</phone>
<address>
114 Auburn Street
Apt 14
Atlanta, GA
</address>
</entry>
</addressbook>
现代的浏览器完全无法从这段代码中获取任何文本的显示格式. XML文档只依据事先定好的格式(例如某些挂接的文档)将数据划分结构.
XML的成员
一份XML文档包括以下成员:
标签(tags)
由尖括号(<>)包围标签名构成, 例如<tag>. 标签名对大小写敏感, 例如<Tag>和<tag>是不同的两个标签.
可以单个出现, 或者成对出现. 单个出现时, 在标签名后空格加一左斜杠(例如<br />), 称作自闭标签(self-closing tag); 成对出现时, 后一个标签在标签名前加一左斜杠(例如<tag></tag>), 前一个标签称作开标签(open tag), 后一个称作闭标签(close tag). 成对的标签可以在两个标签间夹带文本信息.
元素(elements)
元素是XML的基本数据单位. 非空的元素由一对开闭标签及其间的信息构成. 例如, 前述XML代码中<entry>及</entry>标签及其间的所有数据构成entry类的一个元素.
空元素可以由不携带数据的一对开闭标签, 或一个自闭标签表示.
属性(attributes)
除了标签间夹带的数据信息, 每个XML元素还可以添加属性字段, 在开标签或自闭标签中声明, 例如<tag attribute="value"></tag>.
属性可以有任意的名称, 但属性的值必须处于成对的单引号或双引号之间以示标记.
相比起标签间夹带的文本, 属性可以更好地描述一个元素. 例如前述XML代码样例中, <addressbook name="Personal">的属性name使得这个addressbook元素很容易和其他同类元素区分开来. 增加属性字段在XML的语法中不是必须的, 但对构建清晰易读的XML代码有重要的作用.
别名(entities)
XML屏蔽了一些功能性字符. 这些功能性字符需要用下列对应的别名来书写:
& = &
< = <
> = >
" = "
' = '
XML的格式需求
格式严谨(well-formed)的XML文档必须遵从一些规定. 只有符合这些规定要求的XML文档才能正常地被各种程序取用.
根元素(root element)唯一
根元素表示该元素位于最底层, 即: 该元素不被包括在任何其他元素当中. XML语法规定: 每一份XML文档只能有一个根元素.
例如, 以下的XML文档是非法的, 因为处于最底层的有两个<monster>元素.
<monster id="91006">
<name>Cerberus</name>
<hp>617600</hp>
<type>Elite</type>
</monster>
<monster id="91007">
<name>Phoneix</name>
<hp>29480</hp>
<type>Rare</type>
</monster>
空元素必须由成对标签或单一子闭标签表示
属性的值必须由单引号或双引号包含
如前所述.
标签可以嵌套, 但不能重叠
例如, 下面的代码是非法的.
<b>Some <i>Text</b></i>
XML模式
XML本身对语法的要求仅限于上述四点. 对于XML可以包含什么元素, 每个元素应该有哪些成员, 有哪些属性, XML文档本身一般不能说明. 这些信息需要通过额外的文件指定, 称作XML规范(XML Schema).
常用的XML规范包括但不限于以下几种:
· DTD (Document Type Definition)
· XML模式(Schema)
· RELAX NG
魔兽世界使用XML Schema来制定XML规范.
XML Schema是一种制定规范的W3C标准. 例如, 前述的addressbook XML文件的规范代码是这样的:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="addressbook" type="AddressBook" />
<xs:complexType name="AddressBook">
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="phone" type="xs:string" />
<xs:element name="address" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
第一行指向XML规范的标准W3C文档; 第二行定义了一个名为addressbook的元素, 之后的几行指定了该元素的类型和其内容的标准格式.
将上面的规范存成文档addressbook.xsd, 这样XML代码就可以取用它.
<addressbook
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="addressbook.xsd">
<name>Alice Applebaum</name>
<phone>+1-212-555-1434</phone>
<address>
114 Auburn Street
Apt 14
Atlanta, GA
</address>
</addressbook>
以下是一些常用的验证XML文档的软件:
· XML Nanny (for MacOSX): http://www.xmlnanny.com/
· Microsoft Visual Studio (for Windows): www.microsoft.com/express/
· XMLSpy, www.alotova.com/products/xmlspy/xml_editor.html
· Desision Soft's Online XML Validator, tools.decisionsoft.com/schemaValidate/
(笔记注: 关于XML Schema的相关知识, 可以参阅IBM developerWorks中国网站XML专区的XML模式专题)
魔兽世界中的XML
魔兽世界的使用者介面有一份极其详尽的XML模式, 指定了所有特定框架中标签, 属性及值的合法写法. 暴雪公司在其界面开发工具包中提供了这个XSD文件(Blizzard Interface Data(enUS)/FrameXML/UI.xsd), 供开发者查阅.
这里是其中的一部分:
<xs:simpleType name="ORIENTATION">
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="HORIZONTAL" />
<xs:enumeration value="VERTICAL" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ColorFloat">
<xs:restriction base="xs:float">
<xs:minInclusive value="0.0" />
<xs:maxInclusive value="1.0" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ColorType">
<xs:attribute name="r" type="ColorFloat" use="required" />
<xs:attribute name="g" type="ColorFloat" use="required" />
<xs:attribute name="b" type="ColorFloat" use="required" />
<xs:attribute name="a" type="ColorFloat" default="1.0" />
</xs:complexType>
<xs:complexType name="GradientType">
<xs:sequence>
<xs:element name="MinColor" type="ColorType" />
<xs:element name="MaxColor" type="ColorType" />
</xs:sequence>
<xs:attribute name="orientation" type="ORIENTATION" default="HORIZONTAL" />
</xs:complexType>
这段代码定义了好几种类型, 包括其属性及合法的值. 第一个代码块定义了名为ORIENTATION的类型, 这是个枚举类型(enumeration), 有HORIZONTAL和VERTICAL两种值. 第二个代码块定义了名为ColorFloat的类型, 其值必须是0.0~1.0的浮点数. 第三个代码块定义了名为ColorType的复杂类型, 有三个属性r, g, b并且是必须的; 有一个a属性但是是可选的, 四个属性都是ColorFloat类型的. 最后一个代码块定义了名为GraidentType的类型, 它必须包含两个子元素, 依次名为MinColor及MaxColor, 均为ColorType型元素; 除此之外, 它还可以包含一个可选的ORIENTATION属性, 默认取值为HORIZONTAL.
根据上面定义的规范, XML文档中的GradientType类型的元素可以这样书写:
<Gradient orientation="VERTICAL">
<MinColor r="1.0" g="0.0" b="0.3" a="1.0" />
<MaxColor r="0.0" g="0.0" b="0.0" a="1.0" />
</Gradient>
这个元素可以用来描述图案上的渐变色.
浙公网安备 33010602011771号