libxml2是一个C语言的XML库,能简单方便的提供对XML文件的各种操作,详细的描述可以查看:http://xmlsoft.org/。
Android中该库的源码在:external\libxml2
如果是C++可以参看external\tinyxml2
以下是简单的解析xml文件代码:
xml文件如下:
<xmlinfo>
<version>xmlinfo1.0</version>
<keyinfo>FCtuwb2LO4evFri</keyinfo>
<chain>
<body>MIIDgzCCAmugAwIBAg</body>
<body>MIIDPDCCAiSgAwIBA</body>
</chain>
</xmlinfo>
解析代码如下:
/********************************************************************
created: 2018/09/06
filename: main.c
author: Albert
depend: libxml2.so
build: mm
purpose: parse a xml
*********************************************************************/
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main(int argc, char** argv)
{
xmlDocPtr doc; //定义解析文件指针
xmlNodePtr curNode; //定义结点指针,需要它在各个结点间移动
xmlChar *szKey; //临时字符串变量
char *szDocName;
if (argc <= 1)
{
printf("Usage : %s docname \n", argv[0]);
return -1;
}
szDocName = argv[1];
/*解析文件*/
doc = xmlParseFile(szDocName);
if ( NULL == doc)
{
fprintf(stderr,"Document not parsed successfully. \n");
return -1;
}
/*确定文件根元素*/
curNode = xmlDocGetRootElement(doc);
if ( NULL == curNode )
{
fprintf(stderr,"empty document \n");
xmlFreeDoc(doc);
return -1;
}
printf("curNode->name = %s \n", curNode->name);
if ( xmlStrcmp( curNode->name, BAD_CAST"xmlinfo" ) )
{
fprintf(stderr,"document of the wrong type, root node != xmlinfo\n");
xmlFreeDoc(doc);
return -1;
}
curNode = curNode->children;
xmlNodePtr propNodePtr = curNode;
while ( curNode != NULL )
{
/*取出结点中的内容*/
if ( !xmlStrcmp( curNode->name, BAD_CAST"version" ) )
{
szKey = xmlNodeGetContent(curNode);
printf("version: %s \n", szKey);
xmlFree(szKey);
}
/*取出结点中的内容*/
if ( !xmlStrcmp( curNode->name, BAD_CAST"keyinfo" ) )
{
szKey = xmlNodeGetContent(curNode);
printf("keyinfo: %s \n", szKey);
xmlFree(szKey);
}
/*取出结点中的内容*/
if ( !xmlStrcmp( curNode->name, BAD_CAST"chain" ) )
{
propNodePtr = curNode->children;
while( propNodePtr != NULL )
{
/*取出结点中的内容*/
if ( !xmlStrcmp( propNodePtr->name, BAD_CAST"body" ) )
{
szKey = xmlNodeGetContent(propNodePtr);
printf("body: %s \n", szKey);
xmlFree(szKey);
}
propNodePtr = propNodePtr->next;
}
}
curNode = curNode->next;
}
xmlFreeDoc( doc );
return 0;
}
结果如下:
curNode->name = xmlinfo
version: xmlinfo1.0
keyinfo: FCtuwb2LO4evFri
body: MIIDgzCCAmugAwIBAg
body: MIIDPDCCAiSgAwIBA