一、定义:
可扩展标记语言 (Extensible Markup Language,XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
xml文件格式如下:
<?xml version="1.0" encoding="utf-8"?> <userdata createuser="false"> <dataconnection> <server>localhost</server> <uid>sa</uid> <pwd></pwd> </dataconnection> <net> <name>jiayuan</name> </net> </userdata>
二、语法:
在XML中,采用了如下的语法:
1 任何的起始标签都必须有一个结束标签。
2 可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/ >。XML解析器会将其翻译成<tag</tag>。
3 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
4 所有的特性都必须有值。
5 所有的特性都必须在值的周围加上双引号。
三、下载与安装LIBXML2和ICONV
Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。Libxml2的下载地址是http://xmlsoft.org/,完全版的库是开源的,并且带有例子程序和说明文档。最好将这个库先下载下来,因为这样可以查看其中的文档和例子。
windows版本的的下载地址是http://www.zlatkovic.com/libxml.en.html;这个版本只提供了头文件、库文件和dll,不包含源代码、例子程序和文档。在文本中,只需要下载libxml2库、iconv库和zlib库就行了(注意,libxml2库依赖iconv和zlib库,本文中重点关注libxml2和iconv,zlib不介绍),我使用的版本是libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。
在编程的时候,我们使用windows版本的libxml2、zlib和iconv,将其解压缩到指定文件夹,例如D:"libxml2-2.6.30.win32,D:"zlib-1.2.3.win32以及D:"iconv-1.9.2.win32。事实上,我们知道在windows下面使用头文件、库文件和dll是不需要安装的,它又没有使用任何需要注册的组件或者数据库,只需要告诉编译器和链接器这些资源的位置就可以了。注意:要在path变量中加上D:"iconv-1.9.2.win32"bin;D:"zlib-1.2.3.win32"bin;D:"libxml2-2.6.30.win32"bin这三个地址,否则在执行的时候就找不到。或者使用更简单的方法,把其中的三个dll到拷贝到system32目录中。
四、简单xml操作例子
创建一个xml文档显得非常简单,其流程如下:
1 用xmlNewDoc函数创建一个文档指针doc;
2 用xmlNewNode函数创建一个节点指针root_node;
3 用xmlDocSetRootElement将root_node设置为doc的根结点;
4 给root_node添加一系列的子节点,并设置子节点的内容和属性;
5 用xmlSaveFile将xml文档存入文件;
6 用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。
注意,有多种方式可以添加子节点:第一是用xmlNewTextChild直接添加一个文本子节点;第二是先创建新节点,然后用xmlAddChild将新节点加入上层节点。
创建一个Win32控制台应用程序,源代码文件是CreateXmlFile.cpp,如下:
#include "stdafx.h" #include <stdio.h> #include <libxml/parser.h> #include <libxml/tree.h> #include <iostream.h> int main() { //定义文档和节点指针 xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");//xmlDoc是一个struct,保存了一个xml的相关信息,例如文件名、文档类型、子节点等等 xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root"); //设置根节点 xmlDocSetRootElement(doc,root_node); //在根节点中直接创建节点 xmlNewTextChild(root_node,NULL,BAD_CAST "newNode1",BAD_CAST "newNode1 content"); xmlNewTextChild(root_node,BAD_CAST "newNode2",BAD_CAST "newNode2 content"); xmlNewTextChild(root_node,BAD_CAST "newNode3",BAD_CAST "newNode3 content"); //创建一个节点,设置其内容和属性,然后加入根结点 xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2"); xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT"); xmlAddChild(root_node,node); xmlAddChild(node,content); xmlNewProp(node,BAD_CAST"attribute",BAD_CAST "yes"); //创建一个儿子和孙子节点 node = xmlNewNode(NULL,BAD_CAST "son"); xmlAddChild(root_node,node); xmlNodePtr grandson = xmlNewNode(NULL,BAD_CAST "grandson"); xmlAddChild(node,grandson); xmlAddChild(grandson,xmlNewText(BAD_CAST "This is a grandson node")); //存储xml文档 int nRel = xmlSaveFile("CreatedXml.xml",doc); if (nRel != -1) { cout<<"一个xml文档被创建,写入"<<nRel<<"个字节"<<endl; } //释放文档内节点动态申请的内存 xmlFreeDoc(doc); return 1; }编译运行,会提示一个xml文档被创建,写入245个字节
注意:要将libxml2.lib和iconv.lib两个库文件拷到工程里面,且引入它们。还要设置#include <libxml/parser.h> #include <libxml/tree.h>引用路径。
<?xml version="1.0" ?> - <root> <newNode1>newNode1 content</newNode1> <newNode2>newNode2 content</newNode2> <newNode3>newNode3 content</newNode3> <node2 attribute="yes">NODE CONTENT</node2> - <son> <grandson>This is a grandson node</grandson> </son> </root>
原文链接:https://www.f2er.com/xml/300421.html