XML可以用来写配置 , 这个很简单 . 也可以用来存储数据 . 如果你是一个程序员 , 写一个DTD / SCHEMA, 用来规范XML文件 , 那么你完全可以把这个XML交给策划人员去配置 , 这好像是架构师干的事啊 , 不管怎样这也可以规范你的XML配置写法.起到事半功倍的效果.
目前的文本编辑器有很多 : EverNote , Notepad++ , UltraEdit 等 , 用它们来编写一些简单的配置是可以的 , 但是作为企业级用的XML文件 , 还是用XMLSPY比较好. XMLSPY下载地址 : http://www.altova.com/simpledownload1.html . 目前最新版是 2015版的 . 好了废话不多说 , 正题来了 , 我用的2011版
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (bookCell+)> <!ELEMENT bookCell (btitle,author,part+)> <!ELEMENT btitle EMPTY> <!ELEMENT author EMPTY> <!ELEMENT part (title , chapter)> <!ELEMENT title (#PCDATA)> <!ELEMENT chapter (ctitle , sect1)> <!ELEMENT ctitle (#PCDATA)> <!ELEMENT sect1 (stitle , para)> <!ELEMENT stitle (#PCDATA)> <!ELEMENT para (#PCDATA)> <!ATTLIST btitle name ID #REQUIRED > <!ATTLIST author name CDATA #REQUIRED gender (男|女) #IMPLIED email CDATA #IMPLIED from CDATA #FIXED "CHINA" > <!ENTITY authorName "Aonaufly"> ]> <books> <bookCell> <btitle name = "XML指南"/> <author name = "&authorName;" gender = "男" email = "[email protected]" from = "CHINA"/> <part> <title>Part Title</title> <chapter> <ctitle>Chapter Title</ctitle> <sect1> <stitle><![CDATA[Section1 Title]]></stitle> <para>Text</para> </sect1> </chapter> </part> </bookCell> </books>
解释 : 这是一个内置XML . <!ELEMENT A 是对元素进行限制 , 其中 (B +/*/?/ ) 分别表示元素A中有B元素 1个或多个/0个或多个/0个或1个/ 1个 . EMPTY表示没内容(可以有属性)如<B s= "x"/> , 而 (#PCDATD) 表示B的内容是数据无需解析相当于<![CDATA[ ---- ]]> ; <!ATTLIST A 对属性A进行规范控制,ID B表示 B是具有唯一性的 , #REQUIRED 表示必须要有值 , #IMPLIED 表示这个属性可以被忽略不写 , #FIXED 表示固定值 ; <!ENTITY A B > 就相当于 const * A = B 可以在XML中用 "&A;" 来替代的 .
关于外部DTD文件:
引入 <!DOCTYPE books SYSTEM "x.dtd">
混合DTD <!DOCTYPE books SYSTEM "x.dtd" [
<!-- 内部DTD文件在此编写 -->
]>
schema , 是MicroSoft的 , 用来取代DTD , 他比DTD的优势大 , 但是没有被 W3C认证
<?xml version="1.0" encoding="UTF-8"?> <loads xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///F:/XC/xs.xsd"> <address service="172.0.0.1" point="80"/> <versionx>2.1.1</versionx> <res priority="1"> <content name="main.swf" type="byte" url="s/q/"/> <content name="lan.txt" type="txt" url="s/l"/> </res> </loads>
接下来 , 是Schema 文件 xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:simpleType name="typeEnum"> <xs:restriction base="xs:string"> <xs:enumeration value="byte"/> <xs:enumeration value="txt"/> </xs:restriction> </xs:simpleType> <xs:attributeGroup name="addressGrop"> <xs:attribute name="service" type="xs:string"/> <xs:attribute name="point" type="xs:int"/> </xs:attributeGroup> <xs:complexType name="resComplex"> <xs:sequence> <xs:element name="content"> <xs:complexType> <xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="type" type="typeEnum"/> <xs:attribute name="url" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="priority" type="xs:string"/> </xs:complexType> <xs:element name="loads"> <xs:complexType> <xs:sequence> <xs:element name="address"> <xs:complexType> <xs:attributeGroup ref="addressGrop"/> </xs:complexType> </xs:element> <xs:element name="versionx" type="xs:string"/> <xs:element name="res" type="resComplex" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
下回分解 ...
<xs:element name = "A" 加入元素A <A /> 或 <A></A>
<xs:attribute name = "B" type= "xs:string"加入属性B <A B= "c" /> 类型为string
<xs:complexType 加入复杂类型 , 用于 <xs:element 后
<xs:sequence 加入序列放在xs:complexType后面
关于扩展基本属性 看TypeEnum
扩展属性组 看addressGroup
注意基本属性的扩展 和 其他扩展在XML中的用法是不一样的
当然还有 Group
element 也可以扩展