Mini-XML 入门
这一章描述了如何写一个程序使用Mini-XML来访问XML文件中的数据.Mini-XML提供了以下功能:
∙马景涛吴佳妮在内存中创建和管理XML文档的函数.
∙读UTF-8和UTF-16 编码的XML文件和字符串.
∙写UTF-8 编码的XML文件和字符串.
∙支持任意的元素名称,属性以及属性值,没有任何其他限制,仅受限于有效内存.
∙支持整形、浮点、自定义("CDATA")和文本数据类型在"叶"节点.
∙提供"查"、"索引"、以及"步进"函数可以很简单的访问XML文档中的数据.
Mini-XML 不进行基于"XML方案(SCHEMA)"文件或者其他内容源定义信息的校验和其他类型的处理 ,也不支持其他组织所要求的XML规范.
基础知识
Mini-XML 提供的一个你需要包含的头文件:
#include <mxml.h>
把Mini-XML库连接到你的应用程序使用-lmxml 选项:
gcc -o myprogram myprogram.c -lmxml ENTER
如果你已经安装pkg-config(1) 软件, 你可以使用它来为你的安装确定适当的编译和连接选项:
pkg-config --cflags mxml ENTER
pkg-config --libs mxml ENTER
节点
每一块XML文件中的信息片断(元素、文本、数字)是一个存储在内存中的"节点(nodes)" .节
点使用mxml_node_t 结构进行定义. 它的type 成员变量定义了节点类型(element, integer, opaque, real, or text) 决定了需要从联合(union)类型的成员变量value 中获取的值.
表 2-1: Mini-XML 节点值的成员变量值 | 类型 | 节点成员 |
用户定义 | void * | node->value.custom.data 一般纳税人税率 |
XML元素 | char * | node->value.element.name |
整数 | int | node->value.integer |
不透明字符串 | char * | node->value.opaque |
浮点数 | double | node-&al |
文本 | char * | node-&string |
译者:节点类型定义枚举参见:mxml_type_e。 Mini-XML中的节点类型定义和其他有些解析器有些不同,其中整数、浮点、和文本节点是指在一个XML元素中一系列的使用空格作
为分割的值,每个元素 可以拥有多个以上节点,并可以选择使用空格分开,如:<abc>aa bb cc</abc>,Mini-MXML在使用参数:MXML_TEXT_CALLBACK进行载入时,将在abc元素下面生成3个text类 型的子节点。在创建时也可以使用同样的方式创建节点。整数和浮点也是同样方式,但如果转换失败则MiniXML报错。而不透明字符串类型(OPAQUE) 则不进行字符串分割,在载入时需要使用MXML_OPAQUE_CALLBACK参数,将所有字符串形成一个子节点。详情见:使用加载回调函数。 Z.F
每一个节点总是有一个成员变量:user_data 可以允许你为每一个节点关联你需要的应用数据.
新的节点可以使用以下函数进行创建 mxmlNewElement, 很烦很累的心情说说mxmlNewInteger, mxmlNewOpaque, mxmlNewReal, mxmlNewText mxmlNewTextf mxmlNewXML . 只有 elements 可以拥有子节点,顶级节点必须是一个 element , 通常是<?xml version="1.0"?> 使用mxmlNewXML()函数创建的节点.
每个节点都有一些关联节点的指针,上(parent), 下(child), 左(prev), and 右(next) 相对应于当前节点. 如果你有一个XML文件如下所示:
<?xml version="1.0"?>
<data>
<node>val1</node>
<node>val2</node>
<node>val3</node>
<group>
<node>val4</node>
<node>val5</node>
<node>val6</node>
</group>
<node>val7</node>
<node>val8</node>
</data>
那么在内存中的文件节点树看上去如下所示:
?xml
|
data
|泰坦尼克号简介
node - node - node - group - node - node
| | | | | |
val1 val2 val3 | val7 val8
|
node - node - node
| | |
val4 val5 val6
这里"-"指向下一个节点,"|"指向第一个子节点。
当你使用完毕这些XML数据后,使用函数mxmlDelete 来释放指定节点或者整个XML树节点和它下面所有子节点的内存:
mxmlDelete(tree);
创建 XML 文档
你可以在内存中创建和更新XML文档,使用mxmlNew 一系列函数. 下面的代码将创建上一章描述的XML文档:
mxml_node_t *xml; /* <?xml ... ?> */
mxml_node_t *data; /* <data> */
mxml_node_t *node; /* <node> */
mxml_node_t *group; /* <group> */
xml = mxmlNewXML("1.0");
data = mxmlNewElement(xml, "data");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val1");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val2");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val3");
什么冰箱好
group = mxmlNewElement(data, "group");
node = mxmlNewElement(group, "node");
mxmlNewText(node, 0, "val4");
node = mxmlNewElement(group, "node");
mxmlNewText(node, 0, "val5");
node = mxmlNewElement(group, "node");
mxmlNewText(node, 0, "val6");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val7");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val8");
我们首先使用mxmlNewXML函数来创建所有XML文件都需要的标头 <?xml version="1.0"?> :
xml = mxmlNewXML("1.0");
然后我们使用mxmlNewElement函数来创建本文件使用的<data>节点.第一个参数指定了父节点(xml) ,第二个参数是元素名 (data):
data = mxmlNewElement(xml, "data");
每个在本文件中<node>...</node>之间的部分使用函数mxmlNewElement 和 mxmlNewText来创建. mxmlNewText 的第一个参数指定了父节点 (node).第二个参数指定了是否在文本之前添加空白字符,在本例中使用0或者false.最后一个参数指定了需要添加的实际文本:
node = mxmlNewElement(data, "node");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论