1 概述
本文档适用于C语言开发人员,文档详细讲述Xml解析器SDK中每个函数的
用法以及源码示例。
2 Xml介绍
参考相关文档。
3 Xml 解析器SDK技术特点
支持以下功能:
1、支持标准xml语法文档
2、支持注释节点
3、支持解析属性值
4、支持实体引用
其他说明:
1、支持任意层次的嵌套
2、支持解析xml文档的大小没有限制
3、解析效率高
4、函数简介易用
5、支持windows、linux、unix等操作系统,支持32位和64位开发平台
6、提供基于c语言的开发SDK
4 Xml解析器应用场景
1、需要高效解析xml文档
5 定义说明
1、HXMLDOM
指向一个Xml文档的句柄,即指向Xml文档的指针,定义如下:
typedef void* HXMLDOM;
2、HXMLNODE
HXMLNODE定义为一个指向Xml节点的指针,定义如下:
typedef void* HXMLNODE;
3、HXMLATTR
HXMLATTR定义为一个指向Xml属性节点的指针,定义如下:
typedef void* HXMLATTR;
4、根节点
每个Xml文档都有唯一一个根节点,此根节点是内部使用,用于获取用户定义的子节点。根节点是特殊的节点,没有属性和值。
5、节点
每个节点拥有名字、值、属性链表和子节点链表。
6、头子节点
每个节点拥有的子节点链表的第一个子节点。
7、尾子节点
每个节点拥有的子节点链表的最后一个子节点。
8、上一节点
相当于当前节点所在的节点链表中的上一个相邻节点
9、下一节点
相当于当前节点所在的节点链表中的下一个相邻节点
10、节点属性
属性拥有:属性名字和属性值。
12、属性链表
每个节点拥有属性链表,保存当前节点的所有属性。
6 Xml解析器SDK功能函数
6.1 XmlCreateDom()
1、功能说明
此函数用来解析xml文本,执行成功后返回DOM句柄,之后对此DOM的操作都引用此句柄。
2、函数原型
int XmlCreateDom(char* sXml, HXMLDOM&hDom);
3、参数说明
1)char* sXml
输入参数。是\0结尾的xml字符串。
2)HXMLDOM hDom
输出参数。返回非NULL的句柄。
4、返回值
执行成功返回0,执行失败时返回非0。
5、相关函数
XmlDestroyDom(HXMLDOM hDom)
示例:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
if(nRet == 0)
{
printf(“解析Xml成功”);
}
else
{
printf(“解析Xml失败”);
}
XmlDestroyDom(hDom);
return 0;
}
6.2 XmlGetErrorStartPos()
1、功能说明
此函数用来销毁DOM,删除后的DOM句柄不能再被引用。
2、函数原型
char* XmlGetErrorStartPos(HXMLDOMhDom);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
4、返回值
当执行XmlCreateDom是由于解析xml失败时,通过此函数返回解析失败时
的位置指针,可以通过此指针判断解析失败的原因。
5、相关函数
XmlCreateDom()
XmlDestroyDom()
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Xame>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom (hDom);
if(nRet == 0)
{
printf(“解析Xml成功”);
}
else
{
printf(“解析Xml失败: %s”, XmlGetErrorStartPos(hDom));
}
XmlDestroyDom(hDom);
return 0;
}
6.3 XmlDestroyDom()
1、功能说明
此函数用来销毁DOM,删除后的DOM句柄不能再被引用。
2、函数原型
void XmlDestroyTree(HXMLDOM hDom);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
4、返回值
无
5、相关函数
XmlCreateDom()
示例1:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
if(nRet == 0)
{
printf(“解析Xml成功”);
}
else
{
printf(“解析Xml失败”);
}
XmlDestroyDom(hDom);
return 0;
}
6.4 XmlGetRoot()
1、功能说明
此函数用来获取DOM的根节点,根节点是访问DOM的入口,根节点是特殊节点,没有节点名字,没有属性列表,没有父节点,只有子节点链表。
2、函数原型
HXMLNODE XmlGetRoot(HXMLDOM hDom);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
4、返回值
返回非NULL的xml节点句柄。
5、相关函数
XmlCreateDom()
示例1:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.5 XmlGetHeadNode()
1、功能说明
此函数用来返回指定Xml节点的头子节点句柄。
2、函数原型
HXMLNODE XmlGetHeadNode(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定xml节点句柄。
4、返回值
返回hNode节点头子节点的句柄。如果hNode没有子节点返回NULL,否则返
回非NULL的句柄。
5、相关函数
XmlGetTailNode()
XmlGetNextNode()
XmlGetPrevNode()
示例1:
功能:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
char* sName;
sName = XmlGetNodeName(hNode);
printf(“%s”, sName);
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.6 XmlGetNextNode()
1、功能说明
此函数用来返回指定节点的下一个节点,这两个节点拥有同一个父节点。
2、函数原型
HXMLNODE XmlGetNextNode(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,hNode为指定的当前节点。
4、返回值
返回节点句柄,如果当前节点已经是最后的尾节点则返回NULL,否则返回非
NULL的句柄。
5、相关函数
XmlGetHeadNode()
XmlGetPrevNode()
XmlGetTailNode()
示例:
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
HXMLNODE hNodeB;
hNodeB = XmlGetHeadNode(hNodeA);
while(nNodeB != NULL)
{
printf(“%s”, XmlGetNodeName(nNodeB));
hNodeB = XmlGetNextNode(hNodeB);
}
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.7 XmlGetPrevNode()
1、功能说明
此函数用来返回指定节点的上一个节点,这两个节点拥有同一个父节点。
2、函数原型
HXMLNODE XmlGetPrevNode(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,hNode为指定的当前节点。
4、返回值
返回节点句柄,如果当前节点已经是头节点则返回NULL,否则返回非。
NULL的句柄。
5、相关函数
XmlGetHeadNode()
XmlGetNextNode()
XmlGetTailNode()
示例:参考AvlGetHeadPosition
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
HXMLNODE hNodeB;
hNodeB = XmlGetTailNode(hNodeA);
while(nNodeB != NULL)
{
printf(“%s”, XmlGetNodeName(nNodeB));
hNodeB = XmlGetPrevNode(hNodeB);
}
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.8 XmlGetTailNode()
1、功能说明
此函数用来返回指定Xml节点的头子节点句柄。
2、函数原型
HXMLNODE XmlGetHeadNode(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定xml节点句柄。
4、返回值
返回hNode节点头子节点的句柄。如果hNode没有子节点返回NULL,否则返
回非NULL的句柄。
5、相关函数
XmlGetHeadNode()
XmlGetNextNode()
XmlGetPrevNode()
6.9 XmlGetChildNode()
1、功能说明
此函数指定名字的子节点,支持返回多个具有相同名字的子节点。
2、函数原型
int XmlGetChildNode(HXMLNODE hNode,char*sName, int nMaxChild,
HXMLNODE hChildNode[]);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
2) char* sName
输出参数,要获取子节点的名字,注意区分大小写。
3) int nMaxChild
输入参数, 要获取子节点的最大数量。
4) HXMLNODE hChildNode[]
输入(出)参数,接收返回子节点句柄的数组指针,注意,此指针指向的数组元素的数量要大于等于nMaxChild。
4、返回值
返回具有指定名字子节点的数量,该返回值小于等于nMaxChild。
5、相关函数
XmlGetSingleChildNode()
示例1:
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<PastName>zhangyi</PastName>\r\n\
<PastName>zhanger</PastName>\r\n\
<PastName>zhangsi</PastName>\r\n\
<PastName>zhangwu</PastName>\r\n\
<PastName>zhangliu</PastName>\r\n\
<PastName>zhangqi</PastName>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
HXMLNODE hNodeArray[16];
int nCount;
nCount = XmlGetChildNode(hNodeA, “PassName”,16, hNodeArray);
int i;
for(i = 0; i < nCount; i++)
{
printf(“%s”, XmlGetNodeValue(hNodeArray[i]));
}
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.10 XmlGetSingleChildNode()
1、功能说明
此函数指定名字的第一个子节点。
2、函数原型
HXMLNODE XmlGetChildNode(HXMLNODE hNode,char*sName);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
2) char* sName
输出参数,要获取子节点的名字,注意区分大小写。
4、返回值
返回第一个具有指定名字子节点的句柄,如果没有指定名字的节点,返回
NULL。
5、相关函数
XmlGetChildNode()
示例1:
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<PastName>zhangyi</PastName>\r\n\
<PastName>zhanger</PastName>\r\n\
<PastName>zhangsi</PastName>\r\n\
<PastName>zhangwu</PastName>\r\n\
<PastName>zhangliu</PastName>\r\n\
<PastName>zhangqi</PastName>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
HXMLNODE hNodeB;
hNodeB = XmlGetSingleChildNode(hNodeA, “PassName”);
printf(“%s”, XmlGetNodeValue(hNodeB);
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.11 XmlGetChildNodeValue()
1、功能说明
此函数返回第一个指定名字的子节点的值。
2、函数原型
char* XmlGetChildNodeValue(HXMLNODEhNode,char* sName);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
2) char* sName
输出参数,要获取子节点的名字,注意区分大小写。
4、返回值
如果存在指定名字的子节点,返回一个指向字符串的指针;否则返回NULL。
5、相关函数
XmlGetChildNodeValueEx()
6.12 XmlGetChildNodeValueEx()
1、功能说明
此函数返回第一个指定名字的子节点的值。
2、函数原型
bool XmlGetChildNodeValueEx(HXMLNODEhNode,char* sName,
char* sValue);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
2) char* sName
输入参数,要获取子节点的名字,注意区分大小写。
3) char*& sValue
输出参数, 如果存在指定名字的子节点,返回一个指向字符串的指针。
4、返回值
如果存在指定名字的子节点返回true, 否则返回false。
5、相关函数
XmlGetChildNodeValueEx()
示例:参考AvlGetHeadPosition
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
printf(“%s”, XmlGetChildNodeValue(“CardID”));
printf(“%s”, XmlGetChildNodeValue(“Name”));
printf(“%s”, XmlGetChildNodeValue(“Age”));
printf(“%s”, XmlGetChildNodeValue(“Sex”));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.13 XmlGetChildCount()
1、功能说明
此函数返回指定节点的子节点数量。
2、函数原型
int XmlGetChildCount(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回子节点的数量,大于等于0。
5、相关函数
XmlGetChildNode()
示例:
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
printf(“%d”, XmlGetChildCount(hNodeA));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.14 XmlGetParentNode()
1、功能说明
此函数返回指定节点的父节点。
2、函数原型
int XmlGetParentNode(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回节点的父节点的句柄,注意只有根节点没有父节点,其他节点都有一个
非NULL的父节点。
5、相关函数
XmlGetChildNode()
示例:
char* g_sXmlText =
“<PeronInfo>\r\n\
<CardID>133552197410282628</CardID>\r\n\
<Name>zhangsan</Name>\r\n\
<Age>28</Age>\r\n\
<Sex>Male</Sex>\r\n\
</PeronInfo>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNodeA;
hNodeA = XmlGetHeadNode(hRootNode);
printf(“%s”, XmlGetNodeName(hNodeA));
HXMLNODE hNodeB;
hNodeB = XmlGetHeadNode(hNodeA);
printf(“%s”, XmlGetNodeName(hNodeB));
HXMLNODE hNodeC;
hNodeC = XmlGetParentNode(hNodeB);
printf(“%s”, XmlGetNodeName(hNodeC));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.15 XmlGetNodeName()
1、功能说明
此函数用来根据节点句柄获取节点的名字。
2、函数原型
char* XmlGetNodeName(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回节点的名字。
5、相关函数
XmlGetNodeValue()
示例:
6.16 XmlGetNodeValue()
1、功能说明
此函数用来根据节点句柄获取节点的值。
2、函数原型
char* XmlGetNodeValue(HXMLNODEhNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回节点的值。
5、相关函数
6.17 XmlGetHeadAttr()
1、功能说明
此函数用来返回指定Xml节点的第一个属性的句柄。
2、函数原型
HXMLATTR XmlGetHeadAttr (HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定xml节点句柄。
4、返回值
返回hNode节点第一个属性的句柄。如果hNode没有属性返回NULL,否则返
回非NULL的句柄。
5、相关函数
XmlGetTailAttr()
XmlGetNextAttr()
XmlGetPrevAttr()
示例1:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
HXMLATTR hXmlAttr;
hXmlAttr = XmlGetHeadAttr(hNode);
printf(“%s = %s”, XmlGetAttrName(hXmlAttr), XmlGetAttrValue(hXmlAttr));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.18 XmlGetTailAttr()
1、功能说明
此函数用来返回指定Xml节点的最后一个属性的句柄。
2、函数原型
HXMATTR XmlGetTailAttr (HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定xml节点句柄。
4、返回值
返回hNode节点最后一个属性的句柄。如果hNode没有属性返回NULL,否则
返回非NULL的句柄。
5、相关函数
XmlGetHeadAttr()
XmlGetNextAttr()
XmlGetPrevAttr()
示例1:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetTailNode(hRootNode);
HXMLATTR hXmlAttr;
hXmlAttr = XmlGetHeadAttr(hNode);
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),XmlGetAttrValue(hXmlAttr));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.19 XmlGetNextAttr()
1、功能说明
此函数用来返回指定属性节点的下一个属性节点,这两个属性节点拥有同一个Xml节点。
2、函数原型
HXMATTR XmlGetNextAttr(HXMATTR hAttr);
3、参数说明
1)HXMLATTR hAttr
输入参数,hAtrr为指定的当前属性节点。
4、返回值
返回属性的句柄,如果当前属性已经是最后一个属性则返回NULL,否则返回
非NULL的句柄。
5、相关函数
XmlGetHeadAttr()
XmlGetPrevAttr()
XmlGetTailAttr()
示例1:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
HXMLATTR hXmlAttr;
hXmlAttr = XmlGetHeadAttr(hNode);
while(hXmlAttr != NULL)
{
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),
XmlGetAttrValue(hXmlAttr));
hXmlAttr = XmlGetNextAttr(hXmlAttr);
}
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.20 XmlGetPrevAttr()
1、功能说明
此函数用来返回指定属性的上一个属性,这两个属性拥有同一个Xml节点。
2、函数原型
HXMATTR XmlGetPrevAttr(HXMATTR hAttr);
3、参数说明
1)HXMLATTR hAttr
输入参数,hAtrr为指定的当前属性节点。
4、返回值
返回属性的句柄,如果当前属性已经是第一个属性则返回NULL,否则返回
非NULL的句柄。
5、相关函数
XmlGetHeadAttr()
XmlGetNextAttr()
XmlGetTailAttr()
示例1:
功能:采用降序遍历avl树中的节点
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(g_sXmlText, hDom, true, 1024*8);
if(nRet != 0)
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
HXMLATTR hXmlAttr;
hXmlAttr = XmlGetTailAttr(hNode);
while(hXmlAttr != NULL)
{
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),
XmlGetAttrValue(hXmlAttr));
hXmlAttr = XmlGetPrevAttr(hXmlAttr);
}
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.21 XmlGetAttrName()
1、功能说明
此函数用来根据属性句柄获取属性的名字。
2、函数原型
char* XmlGetAttrName(HXMLATTR hAttr);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回节点的名字。
5、相关函数
XmlGetAttrValue()
6.22 XmlGetAttrValue()
1、功能说明
此函数用来根据属性句柄获取属性的值。
2、函数原型
char* XmlGetAttrValue(HXMLATTRhAttr);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回属性的值。
5、相关函数
XmlGetAttrName()
示例:
功能:根据节点句柄删除节点。
#include "XmlAPI.h"
6.23 XmlGetAttrCount()
1、功能说明
此函数返回指定节点的属性的数量。
2、函数原型
int XmlGetAttrCount(HXMLNODE hNode);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
4、返回值
返回属性的数量,大于等于0。
5、相关函数
XmlGetAttr()
示例1:
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
HXMLATTR hXmlAttr;
hXmlAttr = XmlGetHeadAttr(hNode);
printf(“%d”, XmlGetAttrCount(hXmlAttr));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.24 XmlGetAttr()
1、功能说明
此函数返回某xml节点指定名字的属性句柄。
2、函数原型
HXMLATTR XmlGetAttr(HXMLNODE hNode,char*sName);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
2) char* sName
输出参数,要获取属性的名字,注意区分大小写。
4、返回值
返回定名字属性的句柄,如果没有指定名字的属性,返回NULL。
5、相关函数
XmlGetAttrValueByName()
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
HXMLATTR hXmlAttr;
hXmlAttr = XmlGetAttr(hNode,“CardID”);
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),XmlGetAttrValue(hXmlAttr));
hXmlAttr = XmlGetAttr(hNode,“Name”);
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),XmlGetAttrValue(hXmlAttr));
hXmlAttr = XmlGetAttr(hNode,“Age”);
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),XmlGetAttrValue(hXmlAttr));
hXmlAttr = XmlGetAttr(hNode,“Sex”);
printf(“%s = %s”, XmlGetAttrName(hXmlAttr),XmlGetAttrValue(hXmlAttr));
Exit:
XmlDestroyDom(hDom);
return 0;
}
6.25 XmlGetAttrValueByName()
1、功能说明
此函数返回某xml节点指定名字的属性的值。
2、函数原型
char* XmlGetAttrByName(HXMLNODE hNode,char*sName);
3、参数说明
1)HXMLNODE hNode
输入参数,指定的节点句柄。
2) char* sName
输出参数,要获取属性的名字,注意区分大小写。
4、返回值
返回定名字属性的值,如果没有指定名字的属性,返回NULL。
5、相关函数
XmlGetAttr()
#include “XmlAPI.h"
char* g_sXmlText =
“<PeronInfo CardID=\”133552197410282628\” Name=\“zhangsan\”
Age=\”28\” Sex = \“Male\”/>”;
int main(int argc, char* argv[])
{
int nRet;
HXMLDOM hDom;
nRet = XmlCreateDom(hDom);
{
printf(“解析Xml失败”);
goto Exit;
}
HXMLNODE hRootNode;
hRootNode = XmlGetRoot(hDom);
HXMLNODE hNode;
hNode = XmlGetHeadNode(hRootNode);
printf(“%s”, XmlGetAttrValueByName(hNode,“CardID”);
printf(“%s”, XmlGetAttrValueByName(hNode,“Name”);
printf(“%s”, XmlGetAttrValueByName(hNode,“Age”);
printf(“%s”, XmlGetAttrValueByName(hNode,“Sex”);
Exit:
XmlDestroyDom(hDom);
return 0;
}
7 Xml生成器SDK功能函数
7.1 XmlCreateDom()
1、功能说明
此函数也可以用来xml的DOM,然后导出xml文本。执行成功后返回DOM句柄,之后对此DOM的操作都引用此句柄,。
2、函数原型
int XmlCreateDom(char* sXml, boolbParse, bool bUsePage,
int nPageSize, HXMLDOM& hDom);
3、参数说明
1) char* sXml
输入参数。必须是NULL。
2) bool bParse
输入参数。必须是false,指明是要生成Xml文档。
3) bool bUsePage
输入参数。是否使用页内存分配机制, 默认是true。
4) size_t nPageSize
输入参数。页的字节数量, 默认是8K。
3)HXMLDOM hDom
输出参数。返回非NULL的句柄。
4、返回值
执行成功返回0,执行失败时返回非0。
5、相关函数
XmlDestroyDom(HXMLDOM hDom)
7.2 XmlCreateNode()
1、功能说明
此函数用来返回指定Xml节点的头子节点句柄。
2、函数原型
HXMLNODE XmlCreateNode(HXMLDOMhXmlDom, HXMLNODE hNode,
char* sName, char* sValue);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
2)HXMLNODE hNode
输入参数,要生成节点的父节点句柄。
3)char* sName
输入参数,指定xml节点的名字。
4)char* sValue
输入参数,指定xml节点的值。
1、sName != NULL&& sValue != NULL,Xml文本为以下形式:
<Name>zhangsan</Name>
2、sName != NULL&& sValue == NULL, 生成的节点下面会有子节点或者是
<Name/>
4、返回值
返回要生成Xml节点的句柄。
5、相关函数
XmlCreateAttr()
示例1:
功能:
7.3 XmlCreateAttr()
1、功能说明
此函数用来在某个节点里生成一个属性,同时返回属性的句柄。
2、函数原型
HXMLATTR XmlCreateAttr(HXMLDOMhXmlDom, HXMLNODE hNode,
char* sName, char* sValue);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
2)HXMLNODE hNode
输入参数,要生成属性所属的节点句柄。
3)char* sName
输入参数,指定xml属性的名字。
4)char* sValue
输入参数,指定xml属性的值。
4、返回值
返回要生成Xml属性的句柄。
5、相关函数
XmlCreateNode()
示例1:
功能:
7.4 XmlGetText()
1、功能说明
此函数用来根据Xml的DOM导出xml文本。
2、函数原型
int XmlGetText(HXMLDOM hDom, char*sXml);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
2) char* sXml
输入参数,用来接收导出的Xml文本。
4、返回值
执行成功返回0,执行失败时返回非0。
5、相关函数
XmlWriteText()
示例:
#include “XmlAPI.h"
int main(int argc, char* argv[])
{
HXMLDOM hDom;
XmlCreateDom(NULL, hDom);
HXMLNODE hRootNode;
hRootNode = XmlGetRootNode(hDom);
HXMLNODE hNode;
hNode = XmlCreateNode(hDom, hRootNode, "PersonInfo", NULL);
XmlCreateAttr(hDom, hNode,"A", "a");
XmlCreateAttr(hDom, hNode,"B", "b");
HXMLNODE hSubNode;
hSubNode = XmlCreateNode(hDom, hNode,"name", "wuerdong");
hSubNode = XmlCreateNode(hDom, hNode,"sex", "male");
hSubNode = XmlCreateNode(hDom, hNode, "age","30");
char sXml[1024*8];
XmlGetText(hDom, sXml);
XmlDestroyDom(hDom);
return 0;
}
7.5 XmlWriteText()
1、功能说明
此函数用来根据Xml的DOM导出xml文本,并以回调函数处理导出过程中的Xml文本,回调函数会被多次调用。
2、函数原型
int XmlWriteText(HXMLDOM hDom, char*sXml, void* pPara);
3、参数说明
1)HXMLDOM hDom
输入参数,hDom是执行XmlCreateDom函数返回的句柄。
3) void* pPara
输入参数,回调函数。
4) void* pPara
输入参数,回调函数的参数。
4、返回值
执行成功返回0,执行失败时返回非0。
5、相关函数
XmlWriteText()
示例:
#include “XmlAPI.h"
bool OnWriteText(char* sXml, void* pPara)
{
FILE* fp;
fp = (FILE *)pPara;
fwrite(sXml, 1,strlen(sXml), fp);
fflush(fp);
return true;
}
int main(int argc, char* argv[])
{
FILE* fp;
fp =fopen("d:\\0.xml", "wb");
HXMLDOM hDom;
XmlCreateDom(NULL, hDom);
HXMLNODE hRootNode;
hRootNode = XmlGetRootNode(hDom);
HXMLNODE hNode;
hNode = XmlCreateNode(hDom, hRootNode, "PersonInfo", NULL);
XmlCreateAttr(hDom, hNode,"A", "a");
XmlCreateAttr(hDom, hNode,"B", "b");
HXMLNODE hSubNode;
hSubNode = XmlCreateNode(hDom, hNode,"name", "wuerdong");
hSubNode = XmlCreateNode(hDom, hNode,"sex", "male");
hSubNode = XmlCreateNode(hDom, hNode, "age","30");
XmlWriteText(hDom, OnWriteText, fp);
fclose(fp);
XmlDestroyDom(hDom);
return 0;
}