本系列将涉及的类有:
体现XML一个属性 |
|
是QXmlStreamAttribute的vector容器,属性性集 |
|
DTD实体声明 |
|
为QXmlStreamReader准备的实体解析器 |
|
XML命名空间声明 |
|
DTD记号声明 |
|
读XML(重要,可串起所有类) |
|
写XML |
以QXmlStreamReader和QXmlStreamWriter为中心,介绍它们的使用。
除这些外,Qt还提供了自己的解析引擎(以QXmlSimpleReader为中心),然而文档说QXmlStreamReader is a faster and more convenient replacement for Qt's own SAX parser (seeQXmlSimpleReader)(QXmlStreamReader比Qt自己的引擎更快更方便,是更好的替代品).故而,讨论以上类更明智些。而且它们的关系更紧凑……
——————————————————————————————————————————————————————————————
在您学习这些类之前,必须对XML有相当的了解,才能运用自如,最好把这里:XML教程的教程的基础部分看完。
下面介绍它,即使你不看上面教程,也许也能很快了解它的。
先认识下xml:
XML 指可扩展标记语言(EXtensible Markup Language)
XML 的设计宗旨是传输数据,而非显示数据
XML可用于当作数据库一样保存数数据,也可以像QSettings那样用于保存程序的大小宽高等,还可以在网络中传输。
一段极简单XML代码:
<note> <to>张三</to> <from>张三老婆</from> <body>别忘吃饭!</body> </note>
上面代码的所有英文及中文都是自己定义的,表示一个便签note,是张三老婆留给他的,提醒他不要忘记吃饭……
XML语言的标签由大于号与小于号组成,格式为: <标签名></标签名>。带/的表示关闭标签,XML很严格,一定是需要它的,不然就解析出错。这些标签不断嵌套就可组成复杂的文档了。可以观察这个比较复杂的XML:点击打开链接,内部<!--注释-->为注释内容。
(到此,如果你看得头晕了,先跳过下面的内容,看本系列的其它篇吧……)
————————————————————————————————————————————————————————————————
接下来,看一篇五脏俱全的:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--这是一个便签-->
<!DOCTYPE Notes [
<!ELEMENT note (date,message)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT message (#PCDATA)>
]>
<Notes>
<note>
<date>2月1日</date>
<message>别忘了参加party</message>
</note>
<note>
<date>2月14日</date>
<message>今天情人节啊</message>
</note>
<note>
<date>2月18日</date>
<message>今天自己煮饭吧</message>
</note>
</Notes>
第一行解释(来自点击打开链接):version="1.0" ,它是表示版本为1.0;
standalone 定义了外部定义的 DTD (上面第三行开始的几行,具体了解DTD见点击打开链接)文件的存在性. standalone element 有效值是 yes 和 no. 如下是一个例子:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE s1 PUBLIC "http://www.ibm.com/example.dtd" "example.dtd">
<s1>.........</s1>
值 no 表示这个 XML 文档不是独立的而是依赖于外部所定义的一个 DTD. 值 yes 表示这个 XML 文档是自包含的(self-contained).
第二行是注释语句。
第三行及往下四行是DTD文档声明,一般XML文档中很少见它。
其它就是主要内容了。<Notes>是根元素,必属包含。其它元素都是父子的关系
Qt中头部与DTD部分,对应的名称与所表示部分如下:
StartDocument()——<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
documentVersion()——version="1.0"
documentEncoding()——encoding="UTF-8"
StandaloneDocument()——standalone="yes"
DTD
notationDeclarations()——<!ELEMENT note (date,message)>
entityDeclarations()——<!ELEMENT date (#PCDATA)><!ELEMENT message (#PCDATA)>
dtdName——Notes,<!DOCTYPE 后那个
dtdPublicId()和dtdSystemId()——注来自点此查看区别
注:[systemId: 外部资源(多半是DTD)的URI,比如本地文件file:///usr/share/dtd/somefile.dtd或者网络某个地址的文件http://www.w3.org/somefile.dtd;
publicId: systemId已经可以表示任何位置的外部DTD资源了,但是它是直接指向相应的资源,publicId的作用在于其间接性。publicID就相当于一个名字,这个名字代表了一个外部资源。比如,我们规定”W3C HTML 4.01″这个字符串对应”http://www.w3.org/somedir/somefile.dtd”这个资源。那么,publicID=”W3C HTML 4.01″ 和 systemID=”http://www.w3.org/somedir/somefile.dtd”是一样的,二者都引用了http://www.w3.org/somedir/somefile.dtd作为该文档的外部DTD。 ]
————————————————————————————————————————————————————————————
XML还有属性这一说法。但由于属性会引起一些问题,W3C建议“请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。”
除XML的基础外,它的命名空间部分也需要认识下:点击打开链接
以下是一篇比较常见的格式文:
<?xml version="1.0" encoding="UTF-8"?> <Notes> <note> <date>2月1日</date> <message>别忘了参加party</message> </note> <note> <date>2月14日</date> <message>今天情人节啊</message> </note> <note> <date>2月18日</date> <message>今天自己煮饭吧</message> </note> </Notes>
以下是为接下来内容准备的,带命名空间的格式文(xmlns即是XMLNamespace,是个XML自带的属性。用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称(代码中http:://……)。):
<?xml version="1.0" encoding="UTF-8"?> <tables> <table xmlns:h="http://www.w3.org/TR/html4/"> <tr> <td>Apples</td> <td>Bananas</td> </tr> </table> <table xmlns:f="http://www.w3school.com.cn/furniture"> <name>African Coffee Table</name> <width>80</width> <length>120</length> </table> </tables>
——————————————————————————————————————————————————————————
分辨URI与URL
统一资源标识符(Uniform Resource Identifier (URI))
统一资源标识符是一串可以标识因特网资源的字符。最常用的 URI 是用来标示因特网域名地址的统一资源定位器(URL)。
——————————————————————————————————————————————————————————
更多参考:
1,XML学习笔记之文档类型定义(DTD) 和实体(ENTITY)
2,XML与DTD(里面有一些记号声明的说明),除本篇外,还有几篇,算是作者的心得吧