找回密码
 点一下
查看: 4922|回复: 6

最简要XML介绍等

[复制链接]
发表于 2010-3-1 18:29:18 | 显示全部楼层 |阅读模式
XML,全称可扩展标记语言(Extensible Markup Language)。搞过网页的童鞋会发现它和HTML非常相似,不过XML要比HTML更为灵活,因为XML的元素不是预定义的,它允许你定义自己需要的元素。其基本组成部分包括:声明根元素元素属性属性值数据注释等。

简介到这里(我也是半桶水),看下面一个最简单的xml文档:

[codes=xml]
<?xml version="1.0" encoding="UTF-8"?>
<!--Books Library-->
<books>
    <book>
        <title>Goblin Academy</title>
        <public year="2002"/>
    </book>
    <book>
        <title>StarCraft2</title>
        <public year="2010"/>
    </book>
</books>
[/codes]

第一行为XML声明,一个正确的XML文档应由XML声明开始。通常声明的第一个属性为version,指定了文档内容所符合的XML版本;第二个属性encoding指定了文档的编码,若文档编码为UTF-8或UTF-16,可省略该属性。本例中,XML文档版本为1.0,编码为UTF-8。
第二行为文档注释,内容由"<!--"和"-->"包围。本例中,注释内容为Books Library。
第三行为文档的根元素,每个XML文档应该有且只有一个根元素。元素名称可以由字母或下划线开头,后跟字母、数字、句点、连接符和下划线。元素中可以包含一个或多个数据、属性或者其它子元素。XML要求开始标签必须与结束标签配对。若元素不包含数据和子元素,标签可以简写为<name [prop="value"].../>,否则应写为<name [prop="value"]...>[...]</name>。本例中,XML文档根元素名称为books,没有属性,包含了两个名为book的子元素。
第四-七行描述了名为Goblin Academy,2002年出版的图书。其中,Goblin Academy为元素title的数据,2002为元素public属性year的值,由于元素public不包含数据和子元素,它的结束标签以简写表示。
第八-十一行描述了名为StarCraft2,2010年出版的图书。
第十二行为根元素books的结束标签,此XML文档至此结束。

整个XML文档的作用是描述了一个书库,里面有两种书,并记录了书名和出版年份。这个文档所有的元素都是由用户自定义的,仅需要符合几个规范,就可以任意添加元素、属性、数据,这正是XML强大之处。

一个格式良好的XML文档应符合以下规范:
1.文档有且只有一个根元素
2.元素的结束标签名称与开始标签名称一致
3.元素名和属性名符合命名规范
4.由开始和结束标签界定的元素必须互相正确地嵌套
5.属性值不能包含有"<"

另外,XML语言是区分大小写的,<books>和<Books>代表的是两个不同的元素,编写XML文档时应带注意。

-----------------------------------------

所谓对象(Object),是人们要进行研究的任何事物。从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
面向对象程序设计(Object-oriented programming)是指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
通常所谓的OOP由下面几个特征组成:(包含属性方法),对象实例),继承性封装性多态性抽象性等。
详情可以参考维基百科:http://zh.wikipedia.org/wiki/%E9 ... F%E8%AE%BE%E8%AE%A1

这里只谈和SC2物体数据编辑有关的部分。

:定义了一件事物的抽象特点。通常来说,类定义了事物的属性和行为。比如说,将机枪兵这个兵种视为一个类,那么攻击力、防御力等均为该类的属性,移动、攻击、死亡等均为该类的行为(也就是方法)。
对象:对象是类的实例。若机枪兵兵种是一个类,那么每个具体的机枪兵均是这个类的实例。同一个类的不同实例间可以拥有不同属性,例如,数个机枪兵可以拥有不同的生命值;也有一些属性是所有实例均相同的(静态属性),例如,机枪兵均拥有相同的护甲。对于同一类,实例可以使用的方法均是相同的。
继承性:继承性是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为基类)要更加具体化。比如,将"人族附加建筑"视为一个类,那么"科技中心"这个附加建筑就是从"人族附加建筑"这个基类中派生的子类,这个子类继承了基类中所有方法和属性,并在这个基础上可以添加自己的方法和属性(举例:提供不同的科技升级),这个下文会有详述。

-----------------------------------------

SC2物体对象的“继承”浅析:

术语参考:头目的“关于SC2 XML数据文件的一些术语规范。”
http://bbs.islga.org/read-htm-tid-38476-fpage-2.html

为避免过于复杂化,这里只分析AbilData.xml(技能数据)的一小部分,让大家有个概念,看以下技能数据:

[codes=xml]
    <!--Terran AddOns Template-->
    <CAbilBuild default="1" id="TerranAddOns">
        <EditorCategories value="Race:Terran,AbilityorEffectType:Units"/>
        <Alert value="AddOnComplete"/>
        <Type value="AddOn"/>
        <FlagArray index="InstantPlacement" value="1"/>
        <FlagArray index="PeonDisableAbils" value="1"/>
        <FlagArray index="ShowProgress" value="1"/>
        <InfoArray index="Build1" Unit="TechLab" Time="25">
            <Resource index="Minerals" value="50"/>
            <Resource index="Vespene" value="50"/>
            <Button DefaultButtonFace="TechLabBarracks" State="Suppressed"/>
        </InfoArray>
        <InfoArray index="Build2" Unit="NuclearReactor" Time="25">
            <Resource index="Minerals" value="50"/>
            <Resource index="Vespene" value="50"/>
            <Button DefaultButtonFace="NuclearReactor" State="Restricted"/>
        </InfoArray>
    </CAbilBuild>
[/codes]

这个CAbilBuild模板定义了属性id值为“TerranAddOns”,作为该模板的名字,若把这个模板看作类,即等于定义了一个名为“TerranAddOns”的类。该类的作用为定义技能:人族建造附加建筑。
由于XML是自解释的,很容易可以看出该类具有若干属性:显示进度条=true(<FlagArray index="ShowProgress" value="1"/>),第一个附加建筑为科技实验室(TechLab),建造时间25,花费50矿50气等等。
这个时候问题来了,虽然人族的兵营,兵工厂,星站都可以建造名称、外观一样的附加建筑,但是实际上科技实验室的内的科技却是各有不同(也就是其实是不同的单位),这个模板没法直接套用在每个建筑上。如果按照WE的方法,就是把这个技能复制3次,再修改其中需要修改的属性,比如兵营的附加建筑技能改成这样:

[codes=xml]
    <!--Terran Barracks AddOns Template-->
    <CAbilBuild default="1" id="BarracksAddOns">
        <EditorCategories value="Race:Terran,AbilityorEffectType:Structures"/>
        <Alert value="AddOnComplete"/>
        <Type value="AddOn"/>
        <FlagArray index="InstantPlacement" value="1"/>
        <FlagArray index="PeonDisableAbils" value="1"/>
        <FlagArray index="ShowProgress" value="1"/>
        <BuildMorphAbil value="BarracksLiftOff"/>
        <InfoArray index="Build1" Unit="BarracksTechLab" Time="25">
            <Resource index="Minerals" value="50"/>
            <Resource index="Vespene" value="50"/>
            <Button DefaultButtonFace="BuildTechLabBarracks" State="Suppressed"/>
        </InfoArray>
        <InfoArray index="Build2" Unit="BarracksNuclearReactor">
            <Resource index="Minerals" value="50"/>
            <Resource index="Vespene" value="50"/>
            <Button DefaultButtonFace="NuclearReactor" State="Restricted"/>
        </InfoArray>   
    </CAbilBuild>
[/codes]

可以看到,修改和新增的属性非常少,不到原技能模板的1/2,却要占用相同的代码空间。不仅如此,如果地图中需要使用大量相似对象,该对象具有大量属性,而我们只需要对每个对象的几个属性进行修改,若沿用以前WE的方法,将是非常难以编辑和调试的。
不过幸好,现在BLZ在SE中引入“继承”的概念,大大方便了地图编辑爱好者,利用这一概念,上述代码可以写成:

[codes=xml]
    <!--Terran Barracks AddOns Template-->
    <CAbilBuild id="BarracksAddOns" parent="TerranAddOns">
        <EditorCategories value="Race:Terran,AbilityorEffectType:Structures"/>
        <BuildMorphAbil value="BarracksLiftOff"/>
        <InfoArray index="Build1" Unit="BarracksTechLab">
            <Button DefaultButtonFace="BuildTechLabBarracks"/>
        </InfoArray>
        <InfoArray index="Build2" Unit="BarracksNuclearReactor"/>
    </CAbilBuild>
[/codes]

只需要在模板主标签中添加属性 parent="父类的名称",就可以继承父类中所有的属性,而在该类中修改的属性将覆盖父类中的属性。比如上例中,<InfoArray index="Build1">标签中的Unit属性被改成了BarracksTechLab(兵营专属科技实验室),但是其继承的所需资源50矿50气保持不变。
再看兵工厂建造附加建筑的代码:

[codes=xml]
    <!--Terran Factory AddOns Template-->
    <CAbilBuild id="FactoryAddOns" parent="TerranAddOns">
        <EditorCategories value="Race:Terran,AbilityorEffectType:Structures"/>
        <BuildMorphAbil value="FactoryLiftOff"/>
        <InfoArray index="Build1" Unit="FactoryTechLab">
            <Button DefaultButtonFace="BuildTechLabFactory"/>
        </InfoArray>
        <InfoArray index="Build2" Unit="FactoryNuclearReactor"/>
        <InfoArray index="Build3">
            <Button DefaultButtonFace="SiloFactory"/>
        </InfoArray>
    </CAbilBuild>
[/codes]

不但继承、覆盖了父类TerranAddOns中的属性,还添加了第三个附加建筑SiloFactory(BTW,估计是为SC2未来两部曲预留的^_^),扩展了可建附加建筑的种类。
使用“继承”概念的好处还包括,很容易就能判断不同子类的区别,而不需要像以前用WE那样在一大堆数据里面查找;很容易就能看到相似的物体和物体之间的关系,如,可以很直观地看到技能B是从技能A修改过来的,而不像WE那样要打开ID列表,查找,再恍然大悟:原来追踪导弹就是刀阵旋风!(DOTA里面TINKER技能改自WC3英雄守望者技能)
发表于 2010-3-1 18:45:03 | 显示全部楼层
在书店里看过几页XML的书.
回复

使用道具 举报

发表于 2010-3-1 19:18:48 | 显示全部楼层
乍然一看,好像很难理解,如果按照书信格式来解释的话,就很容易理解了。
回复

使用道具 举报

发表于 2010-3-1 19:20:48 | 显示全部楼层
XML自我解释已经很好了……貌似没必要在特地看教程吧。
回复

使用道具 举报

发表于 2010-3-1 21:01:11 | 显示全部楼层
有些忘却

拿SC2来举例很人性
回复

使用道具 举报

发表于 2010-3-1 23:18:31 | 显示全部楼层
让教程来的更多些吧....
回复

使用道具 举报

发表于 2010-3-2 11:27:37 | 显示全部楼层
不错的东西~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-26 01:09 , Processed in 0.042598 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表