XML编程
1 XML文档格式
XML
XML, EXtensible Markup Language 可扩展标记语言
实际上,XML的应用一般比较简单,还够不上 一个“语言”的级别。
XML是一个数据格式
,符合这种格式的文件后 缀名通常为*.xml
演示:在C:\下搜索*.xml…
入门示例 下面给出一个简单的例子:
<?xml version="1.0" encoding="GBK"?>
<root>
<host> afanihao.cn </host>
<port> 8080 </port>
</root>
优点:可读性强!
缺点:解析费时、占用空间大、效率低!
XML文档格式
XML文档(document)用于传输数据
总体格式为:
<?xml version="1.0" encoding="GBK"?> //声明
<!DOCTYPE … xxx.dtd …> //DTD(常省略)
<root>
<host> afanihao.cn </host>
<port> 8080 </port>
</root>
//内容
参考教程: w3c school
http://www.w3school.com.cn/xml/
XML声明
XML文档的第一行必须是声明语句
例如,
version 版本号:总是1.0
encoding 文字编码:GBK, UTF-8等,参考《中文问题》
XML语法
<?xml version="1.0" encoding="GBK"?>
<root>
<host> afanihao.cn </host>
<port> 8080 </port>
</root>
简言之,XML文档
是一个由元素成的树型结 构
。。。root,host, port都是元素
XML的元素
示例:
<Contact id="1001" page="1">
<Name> 邵发 </Name>
。。。
</Contact>
- 名称Name:必须配对!
<Name> shaofa </Name>
<name> shaofa </name>
以下写法不对:
<NAME> shaofa </name>
NAME与name不配对
XML的元素
2. 元素的属性
< Contact id=“1001” page=“1”>
(1)采用 key=“value” 形式
(2)key值唯一
(3)多个属性以空格分开
XML的元素
3. 元素的内容可以是Text (文本)
< host> afanihao.cn < /host>
也可以是子元素 Child Element,支持往下嵌 套。。
<note>
<from> 小张 </from>
<time> 2016/1/22 16:20 </time>
<content> 去哪吃饭 ? </content>
</note>
最终构成一个树型结构。
XML文档结构
1.必须有一个唯一的根元素
< root>
… 所有内容放在根元素里 …
< /root>
元素的名称可以任意指定。这里是叫root。
最终形成一个树形结构
XML文档结构
2. 元素内容 元素的内容可以是Text (文本)
< host> afanihao.cn < /host>
也可以是子元素 Child Element,支持往下嵌 套。。
<note>
<from> 小张 </from>
<time> 2016/1/22 16:20 </time>
<content> 去哪吃饭 ? </content>
</note>
XML文档结构
3. 兄弟元素Sibling
处于同一元素底下的子元素,彼此为兄弟关系。 兄弟元素可以同名。
<Contact>
<Name> 邵发 </Name>
<Phone> 13810012345 </Phone>
<Phone> 18600099999 </Phone>
</Contact>
一个联系人Contact可以有多个手机号。。
形式良好的 与 内容合法的
形式良好的 Well Formed
如果语法检查没有问题,那就是形式良好的。言下 之意,不管你内容是否合法。
<?xml version="1.0" encoding="GBK"?>
<root>
<host> afanihao.cn </host>
<port> bu hao yi si </port>
</root>
这个XML文档是形式良好的,但内容有问题!
( 由DTD负责验证内容是否合乎要求 )
小节
一、介绍了XML的特点: 一种用文本形式传输数据的文档格式
二、介绍了元素的相关语法
三、本篇教程只介绍形式良好的XML 至少内容是否良好,则可以由程序来验证。
总体上很简单!DTD比较复杂,但我们一般只 用简单的!
2生成XML文档
tinyxml
tinyxml: 一个小巧的xml库,可以生成和解析 XML文档。免费开源,可以直接将源码加到项 目中,适合多种平台。
本课程使用的是tinyxml v1版本
下载tinyxml
从afanihao.cn上下载。。。
或者从tinyxml的作者官网下载。。。 http://sourceforge.net/projects/tinyxml/
演示:将tinyxml源码加到VC项目中…
生成XML文档
#include “…/tinyxml/tinyxml.h”
// XML文档对象
TiXmlDocument xml_doc;
… 添加 声明 和 元素 …
// 第一种办法:直接保存到文件 xml_doc.SaveFile(“example02a.xml”);
// 第二种办法:转成string
string text ;
text << xml_doc;
添加声明和元素
添加声明
xml_doc.LinkEndChild(new TiXmlDeclaration( “1.0”, “GBK”, “” ));
添加根元素
TiXmlElement * xml_root = new
TiXmlElement(“root”);
xml_doc.LinkEndChild(xml_root);
总之,由父级节点LinkEndChild来挂接子元 素。。。
添加子元素和文本 仍然是使用 LinkEndChild 来挂接。。。
子元素
TiXmlElement* xml_child = new
TiXmlElement(“host”);
xml_root->LinkEndChild(xml_child );
文本
xml_child->LinkEndChild( new TiXmlText(“afanihao.cn”));
设置属性attribute
xml_child->SetAttribute(“checked”, “true”);
xml_child->SetAttribute(“station”, 1001);
元素列表 形如。。。
<?xml version="1.0" encoding="GBK" ?>
<root>
<NoteList>
<Note>… </Note>
<Note>… </Note>
<Note>… </Note>
</NoteList>
</root>
在NoteList下有多个名为Note的元素列表。。
小结
介绍了使用tinyxml库生成XML文档的方法
3 解析XML文档
用tinyxml解析XML
tinyxml也有解析xml的功能
基本框架
TiXmlDocument xml_doc;
xml_doc.LoadFile(“example02a.xml”);
或 xml_doc.Parse ( … )
TiXmlElement* xml_root = xml_doc.RootElement();
得到子元素
TiXmlElement* xml_host
= xml_root->FirstChildElement(“host”);
得到元素的文本和属性
const char* text
= xml_host->GetText();
const char* aChecked
= xml_host->Attribute(“checked”);
const char* aStation
= xml_host->Attribute(“station”);
注:返回值可能为NULL,表示不存在
同名称的元素列表
TiXmlElement* xml_Note
= xml_NoteList->FirstChildElement(“Note”);
while(xml_Note)
{
// 下一个兄弟元素
xml_Note
= xml_Note->NextSiblingElement(“Note”);
}
先找第一个。。。再找兄弟元素。。。
小结
介绍了如何使用tinyxml来解析XML文档
4 XML应用示例 – 配置文件
XML的应用场景
1 配置文件 ( 应用最多的场合 )
2 服务器的RESTful接口 ( 如,亚马逊的云服务接口 )
3 WebService接口
配置文件
配置文件:将用户的配置保存到xml文件里
示例:
一个用于Qt实现的GUI应用程序
( 参考Qt篇 )
学习资源 《C语言/C++学习指南》补充》