0. XML文件
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。
XML的简单易于在任何应用程序中读/写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其他的数据交换格式,但不久之后它们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS、Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果。
1. XML文件格式
XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括一个开始标记(<title>),一个结束标记(</title>)以及两个标记之间的内容,例如,可以将XML元素标记为价格、订单编号或名称。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。
具体规则如下:
XML声明是XML文档的第一句,其格式如下:
<?xml version="1.0" encoding="UTF-8"?>
2、注意大小写
在XML文档中,大小写是有区别的。“<P>”和“<p>”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。
3、XML文档有且只有一个根元素
良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。
4、属性值使用引号
在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
<?xml version="1.0" encoding="UTF-8"?>
5、所有的标记必须有相应的结束标记
在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。
6、所有的空标记也必须被关闭
空标记是指标记对之间没有内容的标记,比如“<img>”等标记。在XML中,规定所有的标记必须有结束标记。
一个XML文件例子
<?xml version="1.0" encoding="UTF-8"?>
<root>
<montitor>
<name>伍六七</name><!--监控的程序名称-->
<path>/usr/bin/</path><!--程序绝对路径-->
<interval>30</interval><!--间隔多久监控一次-->
<restartwait>30</restartwait><!--程序被重启后,等待多久再进行监控-->
<ip>127.0.0.1</ip><!--程序IP-->
<port>9878</port><!--程序端口-->
<request>1;monitor</request><!--发送给程序的报文-->
<response>The ftp is working ok.</response><!--程序给监控的反馈报文-->
<log>
<folderpath>log/</folderpath><!--程序日志保存目录-->
<savedays>2</savedays><!--程序日志保存时间-->
</log>
</montitor>
</root>
2.LINUX 下C++ XML编程
C++ XML文件的创建、解析,修改,可参考下面链接,清晰易实现。
https://blog.csdn.net/hpu11/article/details/80793303
补充一个读取XML文件,并修改属性的例子
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <iostream>
#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
//#include <tinyxml.h>
using namespace std;
// XML文件路径
char *xml_PATH = (char *)"netConfig.xml";
int main(int agrc,char *argv[])
{
xmlChar * value = NULL;
xmlKeepBlanksDefault(0); //忽略空格、回车
/* 获取xml文件指针 */
xmlDocPtr pDoc = xmlReadFile(xml_PATH,NULL,XML_PARSE_RECOVER);
if(pDoc == NULL)
{
cout<<"xml open failed"<<endl; //若文件指针为空,则报告文件打开失败
return 0;
}
/* 获取根节点 */
xmlNodePtr pRoot = xmlDocGetRootElement(pDoc);
if(NULL == pRoot)
{
cout << "get xml Node failed"<<endl;
xmlFreeDoc(pDoc); //若获取根节点失败,则释放xml文件指针
return 0;
}
printf("Node name is \"%s\"\n",pRoot->name); //根结点名称
/*从根节点往下查找子节点*/
xmlNodePtr pFirst = pRoot->xmlChildrenNode;
if(NULL == pFirst)
{
printf("%s No children Node!\n",pRoot->name);
xmlFreeDoc(pDoc); //若无子节点,则释放xml文件指针
return 0;
}
printf("The %s Node‘ children node name is \"%s\"\n",pRoot->name,pFirst -> name);
xmlNodePtr pSecond = pFirst->children;
/*修改Psecond 属性 “name”“伍六七”*/
if (!xmlStrcmp(pSecond->name, BAD_CAST "name"))
{
xmlNodeSetContent(pSecond, BAD_CAST "伍六七");
}
if (NULL == pSecond)
{
printf("%s No children Node!\n",pSecond -> name);
xmlFreeDoc(pDoc); //若无子节点,则释放xml文件指针
return 0;
}
value = xmlNodeGetContent(pSecond);
printf("The Second Node name is \"%s\" --> \"%s\"\n",pSecond -> name,value);
xmlNodePtr pThird = pSecond->next;
if (NULL == pThird)
{
printf("%s No children Node!\n",pThird -> name);
xmlFreeDoc(pDoc); //若无子节点,则释放xml文件指针
return 0;
}
while(pThird != NULL)
{
if(!xmlStrcmp(pThird->name,BAD_CAST"comment"))
{
printf("xmlStrcmp == 0 \n");
pThird = pThird->next;
}
value = xmlNodeGetContent(pThird);
printf("The Node name is \"%s\" --> \"%s\"\n",pThird -> name,value);
pThird = pThird->next;
}
if(NULL == pThird)
printf("No more node!\n");
/*保存修改后的XML文件*/
int nRel = xmlSaveFile("netConfig.xml",pDoc);
if (nRel != -1)
{
cout<<"一个xml文档被创建,写入"<<nRel<<"个字节"<<endl;
}
xmlFreeDoc(pDoc); //使用完成后,释放XML指针;
return 0;
}
3. LINUX 下C++ XML编译命令
g++ xml1.cpp -o main -I /usr/include/libxml2 -L /usr/local/lib -lxml2
需要链接libxml2 和 xml2的头文件,如系统中未有此库,需提前安装。