acl
3.5.3.0
|
#include "../stdlib/acl_array.h"
#include "../stdlib/acl_ring.h"
#include "../stdlib/acl_vstream.h"
#include "../stdlib/acl_htable.h"
#include "../stdlib/acl_vstring.h"
#include "../stdlib/acl_iterator.h"
#include "../stdlib/acl_dbuf_pool.h"
类 | |
struct | ACL_XML3_ATTR |
struct | ACL_XML3_NODE |
struct | ACL_XML3 |
宏定义 | |
#define | ACL_XML3_F_META_QM (1 << 0) |
#define | ACL_XML3_F_META_CM (1 << 1) |
#define | ACL_XML3_F_META_EM (1 << 2) |
#define | ACL_XML3_F_SELF_CL (1 << 3) |
#define | ACL_XML3_F_LEAF (1 << 4) |
#define | ACL_XML3_F_META (ACL_XML3_F_META_QM | ACL_XML3_F_META_CM | ACL_XML3_F_META_EM) |
#define | ACL_XML3_IS_COMMENT(x) (((x)->flag & ACL_XML3_F_META_CM)) |
#define | ACL_XML3_S_NXT 0 |
#define | ACL_XML3_S_LLT 1 |
#define | ACL_XML3_S_LGT 2 |
#define | ACL_XML3_S_LCH 3 |
#define | ACL_XML3_S_LEM 4 |
#define | ACL_XML3_S_LTAG 5 |
#define | ACL_XML3_S_RLT 6 |
#define | ACL_XML3_S_RGT 7 |
#define | ACL_XML3_S_RTAG 8 |
#define | ACL_XML3_S_ATTR 9 |
#define | ACL_XML3_S_AVAL 10 |
#define | ACL_XML3_S_TXT 11 |
#define | ACL_XML3_S_MTAG 12 |
#define | ACL_XML3_S_MTXT 13 |
#define | ACL_XML3_S_MCMT 14 |
#define | ACL_XML3_S_MEND 15 |
#define | ACL_XML3_FLAG_MULTI_ROOT (1 << 0) |
#define | ACL_XML3_FLAG_IGNORE_SLASH (1 << 1) |
#define | acl_xml3_parse acl_xml3_update |
类型定义 | |
typedef struct ACL_XML3 | ACL_XML3 |
typedef struct ACL_XML3_NODE | ACL_XML3_NODE |
typedef struct ACL_XML3_ATTR | ACL_XML3_ATTR |
#define ACL_XML3_F_LEAF (1 << 4) |
leaf node has no child node 是否是元数据
在文件 acl_xml3.h 第 63 行定义.
#define ACL_XML3_F_META (ACL_XML3_F_META_QM | ACL_XML3_F_META_CM | ACL_XML3_F_META_EM) |
在文件 acl_xml3.h 第 66 行定义.
#define ACL_XML3_F_META_CM (1 << 1) |
'!–' flag
在文件 acl_xml3.h 第 60 行定义.
#define ACL_XML3_F_META_EM (1 << 2) |
only '!' flag
在文件 acl_xml3.h 第 61 行定义.
#define ACL_XML3_F_META_QM (1 << 0) |
'?' flag
在文件 acl_xml3.h 第 59 行定义.
#define ACL_XML3_F_SELF_CL (1 << 3) |
self closed flag
在文件 acl_xml3.h 第 62 行定义.
#define ACL_XML3_FLAG_IGNORE_SLASH (1 << 1) |
在文件 acl_xml3.h 第 123 行定义.
#define ACL_XML3_FLAG_MULTI_ROOT (1 << 0) |
是否兼容单节点中没有 '/' 情况
在文件 acl_xml3.h 第 120 行定义.
#define ACL_XML3_IS_COMMENT | ( | x | ) | (((x)->flag & ACL_XML3_F_META_CM)) |
在文件 acl_xml3.h 第 69 行定义.
#define acl_xml3_parse acl_xml3_update |
在文件 acl_xml3.h 第 229 行定义.
#define ACL_XML3_S_ATTR 9 |
标签属性名
在文件 acl_xml3.h 第 81 行定义.
#define ACL_XML3_S_AVAL 10 |
标签属性值
在文件 acl_xml3.h 第 82 行定义.
#define ACL_XML3_S_LCH 3 |
左边 '<' 后第一个字节
在文件 acl_xml3.h 第 75 行定义.
#define ACL_XML3_S_LEM 4 |
左边 '<' 后的 '!'
在文件 acl_xml3.h 第 76 行定义.
#define ACL_XML3_S_LGT 2 |
右边 '>'
在文件 acl_xml3.h 第 74 行定义.
#define ACL_XML3_S_LLT 1 |
左边 '<'
在文件 acl_xml3.h 第 73 行定义.
#define ACL_XML3_S_LTAG 5 |
左边的标签名
在文件 acl_xml3.h 第 77 行定义.
#define ACL_XML3_S_MCMT 14 |
元数据注释
在文件 acl_xml3.h 第 86 行定义.
#define ACL_XML3_S_MEND 15 |
元数据结束
在文件 acl_xml3.h 第 87 行定义.
#define ACL_XML3_S_MTAG 12 |
元数据标签
在文件 acl_xml3.h 第 84 行定义.
#define ACL_XML3_S_MTXT 13 |
元数据文本
在文件 acl_xml3.h 第 85 行定义.
#define ACL_XML3_S_NXT 0 |
下一个节点
在文件 acl_xml3.h 第 72 行定义.
#define ACL_XML3_S_RGT 7 |
右边的 '>'
在文件 acl_xml3.h 第 79 行定义.
#define ACL_XML3_S_RLT 6 |
右边的 '<'
在文件 acl_xml3.h 第 78 行定义.
#define ACL_XML3_S_RTAG 8 |
右边的标签名
在文件 acl_xml3.h 第 80 行定义.
#define ACL_XML3_S_TXT 11 |
节点文本
在文件 acl_xml3.h 第 83 行定义.
在文件 acl_xml3.h 第 16 行定义.
typedef struct ACL_XML3_ATTR ACL_XML3_ATTR |
在文件 acl_xml3.h 第 18 行定义.
typedef struct ACL_XML3_NODE ACL_XML3_NODE |
在文件 acl_xml3.h 第 17 行定义.
ACL_API ACL_XML3* acl_xml3_alloc | ( | void | ) |
创建一个 xml 对象
ACL_API ACL_XML3_ATTR* acl_xml3_attr_alloc | ( | ACL_XML3_NODE * | node | ) |
创建 xml 节点的属性
node | {ACL_XML3_NODE*} xml 节点 |
ACL_API ACL_XML3* acl_xml3_dbuf_alloc | ( | ACL_DBUF_POOL * | dbuf | ) |
创建一个 xml 对象,该 xml 对象及所有的内部内存分配都在该内存池上进行分配
dbuf | {ACL_DBUF_POOL*} 内存池对象,当该针对非 NULL 时,则 xml 对象 及所属节点内存在其基础上进行分配,否则,内部自动创建隶属于 xml 的内存池 |
ACL_API void acl_xml3_foreach_init | ( | ACL_XML3 * | xml, |
ACL_XML3_NODE * | node | ||
) |
将某一个 ACL_XML3_NODE 节点作为一个 XML 对象的根节点,从而可以方便地遍历出该 节点各级子节点(在遍历过程中的所有节点不含本节点自身),该遍历方式有别于单独 遍历某一个 ACL_XML3_NODE 节点时仅能遍历其一级子节点的情形
xml | {ACL_XML3*} xml 对象 |
node | {ACL_XML3_NODE*} AXL_XML_NODE 节点 |
ACL_API int acl_xml3_free | ( | ACL_XML3 * | xml | ) |
释放一个 xml 对象, 同时释放该对象里容纳的所有 xml 节点
xml | {ACL_XML3*} xml 对象 |
ACL_API void acl_xml3_free_array | ( | ACL_ARRAY * | a | ) |
ACL_API ACL_XML3_ATTR* acl_xml3_getAttrById | ( | ACL_XML3 * | xml, |
const char * | id | ||
) |
从 xml 对象中获得指定 id 值的 xml 节点元素的某个属性对象
xml | {ACL_XML3*} xml 对象 |
id | {const char*} id 值 |
ACL_API const char* acl_xml3_getAttrValueById | ( | ACL_XML3 * | xml, |
const char * | id | ||
) |
从 xml 对象中获得指定 id 值的 xml 节点元素的某个属性值
xml | {ACL_XML3*} xml 对象 |
id | {const char*} id 值 |
ACL_API ACL_XML3_ATTR* acl_xml3_getElementAttr | ( | ACL_XML3_NODE * | node, |
const char * | name | ||
) |
从 xml 节点中获得指定属性名的属性对象
node | {ACL_XML3_NODE*} xml 节点 |
name | {const char*} 属性名称 |
ACL_API const char* acl_xml3_getElementAttrVal | ( | ACL_XML3_NODE * | node, |
const char * | name | ||
) |
从 xml 节点中获得指定属性名的属性值
node | {ACL_XML3_NODE*} xml 节点 |
name | {const char*} 属性名称 |
ACL_API ACL_XML3_NODE* acl_xml3_getElementById | ( | ACL_XML3 * | xml, |
const char * | id | ||
) |
从 xml 对象中获得指定 id 值的 xml 节点元素
xml | {ACL_XML3*} xml 对象 |
id | {const char*} id 值 |
ACL_API ACL_XML3_NODE* acl_xml3_getElementMeta | ( | ACL_XML3 * | xml, |
const char * | tag | ||
) |
从 xml 对象中提取有在 ? ! 等开头的节点
xml | {ACL_XML3*} xml 对象 |
tag | {const char*} 标签名 |
ACL_API ACL_ARRAY* acl_xml3_getElementsByAttr | ( | ACL_XML3 * | xml, |
const char * | name, | ||
const char * | value | ||
) |
从 xml 对象中获得所有给定属性名及属性值的 xml 节点元素集合
xml | {ACL_XML3*} xml 对象 |
name | {const char*} 属性名 |
value | {const char*} 属性值 |
从 xml 对象中获得所有的与给定属性名 name 的属性值相同的 xml 节点元素集合
xml | {ACL_XML3*} xml 对象 |
value | {const char*} 属性名为 name 的属性值 |
从 xml 对象中获得所有的与所给标签名相同的 xml 节点的集合
xml | {ACL_XML3*} xml 对象 |
tag | {const char*} 标签名称 |
从 xml 对象中获得所有的与给定多级标签名相同的 xml 节点的集合
xml | {ACL_XML3*} xml 对象 |
tags | {const char*} 多级标签名,由 '/' 分隔各级标签名,如针对 xml 数据: <root> <first> <second> <third name="test1"> text1 </third> </second> </first> <root> <first> <second> <third name="test2"> text2 </third> </second> </first> <root> <first> <second> <third name="test3"> text3 </third> </second> </first> 可以通过多级标签名:root/first/second/third 一次性查出所有符合条件的节点 |
ACL_API const char* acl_xml3_getEncoding | ( | ACL_XML3 * | xml | ) |
获得 xml 的字符集编码格式
xml | {ACL_XML3*} xml 对象 |
ACL_API ACL_XML3_NODE* acl_xml3_getFirstElementByTagName | ( | ACL_XML3 * | xml, |
const char * | tag | ||
) |
从 xml 对象中获得与所给标签名相同的 xml 第一个节点
xml | {ACL_XML3*} xml 对象 |
tag | {const char*} 标签名称 |
ACL_API const char* acl_xml3_getType | ( | ACL_XML3 * | xml | ) |
获得 xml 数据的类型,如:text/xsl
xml | {ACL_XML3*} xml 对象 |
ACL_API int acl_xml3_is_closure | ( | ACL_XML3 * | xml | ) |
判断 xml 对象是否闭合的, 即是否所解析的数据是否完整, 如果该 xml 对象里的 xml 节点元素为空, 则也认为不是闭合的
xml | {ACL_XML3*} xml 对象 |
ACL_API int acl_xml3_is_complete | ( | ACL_XML3 * | xml, |
const char * | tag | ||
) |
根据指定标签名判断 xml 解析已经完成, 当该标签与 xml 对象中 root 一级子节点 中的最后一个 xml 节点的标签相同时, 则认为 xml 解析完成, 为保证判断的正确性, 数据源应保证最外层的根节点只有一个, 即 xml->root 的一级子节点只有一个, 否则 会造成误判
xml | {ACL_XML3*} xml 对象 |
tag | {const char*} 用户给定标签名, 内部在匹配时不区分大小写 |
ACL_API void acl_xml3_multi_root | ( | ACL_XML3 * | xml, |
int | on | ||
) |
设置一个 xml 文档中是否允许有多个根 xml 节点,内部缺省支持多个根节点
xml | {ACL_XML3*} xml 对象 |
on | {int} 非 0 则允许,为 0 表示不允许,当禁止有多个根 xml 节点时, 则在解析时当遇到第一个根节点结束时便返回剩余的数据 |
ACL_API void acl_xml3_node_add_child | ( | ACL_XML3_NODE * | parent, |
ACL_XML3_NODE * | child | ||
) |
将某个 xml 节点作为子节点加入某父 xml 节点中
parent | {ACL_XML3_NODE*} 父节点 |
child | {ACL_XML3_NODE*} 子节点 |
ACL_API ACL_XML3_NODE* acl_xml3_node_alloc | ( | ACL_XML3 * | xml | ) |
创建一个 xml 节点
xml | {ACL_XML3*} xml 对象 |
ACL_API void acl_xml3_node_append | ( | ACL_XML3_NODE * | node1, |
ACL_XML3_NODE * | node2 | ||
) |
向某个 xml 节点添加兄弟节点(该兄弟节点必须是独立的 xml 节点)
node1 | {ACL_XML3_NODE*} 向本节点添加 xml 节点 |
node2 | {ACL_XML3_NODE*} 新添加的兄弟 xml 节点 |
ACL_API int acl_xml3_node_delete | ( | ACL_XML3_NODE * | node | ) |
将某个 xml 节点及其子节点从 xml 对象中删除, 并释放该节点及其子节点所占空间 函数来释放该 xml 节点所占内存
node | {ACL_XML3_NODE*} xml 节点 |
ACL_API ACL_XML3_NODE* acl_xml3_node_next | ( | ACL_XML3_NODE * | node | ) |
获得某个 xml 节点的后一个兄弟节点
node | {ACL_XML3_NODE*} xml 节点 |
ACL_API ACL_XML3_NODE* acl_xml3_node_parent | ( | ACL_XML3_NODE * | node | ) |
获得某个 xml 节点的父节点
node | {ACL_XML3_NODE*} xml 节点 |
ACL_API ACL_XML3_NODE* acl_xml3_node_prev | ( | ACL_XML3_NODE * | node | ) |
获得某个 xml 节点的前一个兄弟节点
node | {ACL_XML3_NODE*} xml 节点 |
ACL_API int acl_xml3_removeElementAttr | ( | ACL_XML3_NODE * | node, |
const char * | name | ||
) |
从 xml 节点删除某个属性对象, 如果该属性为 id 属性, 则同时会从 xml->id_table 中删除
node | {ACL_XML3_NODE*} xml 节点 |
name | {const char*} 属性名称 |
ACL_API void acl_xml3_reset | ( | ACL_XML3 * | xml | ) |
重置 XML 解析器对象
xml | {ACL_XML3*} xml 对象 |
ACL_API void acl_xml3_slash | ( | ACL_XML3 * | xml, |
int | ignore | ||
) |
对于 XML 单节点的情况, 是否允许可以没有 /, 如: <test id="111">, <test id="111">, 当可以允许没有 / 则这两种写法 都是合法的,否则只有第二个写法是合法的,如果允许这种兼容性,则 会造成一定的性能损失
xml | {ACL_XML3*} xml 对象 |
ignore | {int} 如果非 0 表示单节点必须有 / |
ACL_API void acl_xml3_tag_add | ( | const char * | tag | ) |
允许用户自己添加一些非自闭合的标签
tag | {const char*} 标签名,注意标签长度不得大于 254 个字节 |
ACL_API void acl_xml3_tag_init | ( | void | ) |
初始化类似于 input, br, hr 等的自闭合标签, 形成自闭合标签树, 以便于 acl_xml3_tag_selfclosed 查询该树, 检查所给标签是否是保留的自闭合标签, 该函数只能被初始化一次, 也可以不初始化
ACL_API int acl_xml3_tag_leaf | ( | const char * | tag | ) |
判断标签所属 xml 节点是否是叶节点, 叶节点没有子节点
tag | {const char*} 标签名 |
ACL_API int acl_xml3_tag_selfclosed | ( | const char * | tag | ) |
当调用 acl_xml3_tag_init 初始化保留的自闭合标签树后, 可以调用此函数判断所给 标签是否属于自闭合标签, 如果未调用 acl_xml3_tag_init, 则该函数永远返回 0 @parma tag {const char*} 标签名称
ACL_API char* acl_xml3_update | ( | ACL_XML3 * | xml, |
char * | data | ||
) |
解析 xml 数据, 并持续地自动生成 xml 节点树
xml | {ACL_XML3*} xml 对象 |
data | {char*} 以 '\0' 结尾的数据字符串, 可以是完整的 xml 数据; 也可以是不完整的 xml 数据, 允许循环调用此函数, 将不完整数据持续地输入 |