笔记: XML基础

Posted on 2009-06-02 00:11  apex.Cliz  阅读(482)  评论(0)    收藏  举报

标签语言, 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屏蔽了一些功能性字符. 这些功能性字符需要用下列对应的别名来书写:

& = &amp;
< = &lt;
> = &gt;
" = &quot;
' = &apos;

 

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>

这个元素可以用来描述图案上的渐变色.