linux xml解析
2015-09-07 17:04
405 查看
废话不多话,直接上源码!
<?xml version="1.0"?>
<carport name="bochiot company">
<carport_info name="carport_name">
<carport_x>100</carport_x>
<carport_y>200</carport_y>
<zone_num>2</zone_num>
</carport_info>
<zone_group name="zone_group">
<zone id="101" name="zone1">
<coordinate>
<coor_x>1</coor_x>
<coor_y>2</coor_y>
<bind_device_mac type="1">AAAAAAAAAAAA</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>3</coor_x>
<coor_y>4</coor_y>
<bind_device_mac type="0">BBBBBBBBBBBB</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>5</coor_x>
<coor_y>6</coor_y>
</coordinate>
</zone>
<zone id="102" name="zone2">
<coordinate>
<coor_x>7</coor_x>
<coor_y>8</coor_y>
<bind_device_mac type="1">CCCCCCCCCCCC</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>9</coor_x>
<coor_y>10</coor_y>
<bind_device_mac type="0">DDDDDDDDDDDD</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>1</coor_x>
<coor_y>5</coor_y>
</coordinate>
</zone>
</zone_group>
</carport>
--------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
int GetCurFilePath(char *lpOut) // get full path of the executable file
{
char chPath[BUFSIZ] = {0};
int nRetVal = readlink("/proc/self/exe", chPath, sizeof(chPath)); // get full path of the current-executable file
if(nRetVal < 0)
{
strcpy(lpOut, ".");
return -1;
}
else
{
strcpy(lpOut, chPath);
return 0;
}
}
int GetCurDir(char *lpOut) // get directory-path of current executable-file
{
char chPath[BUFSIZ] = { 0 };
if( GetCurFilePath(chPath) < 0 )
return - 1;
dirname(chPath); // dirname will change value of "chPath"(contain result)
strcpy(lpOut, chPath); // copy result to out-param
return 0;
}
xmlDocPtr getdoc(char *docname) // 根据文件名得到文档指针
{
xmlDocPtr doc;
xmlKeepBlanksDefault(0);
doc = xmlParseFile(docname);
if(doc == NULL)
{
fprintf(stderr, "Document not parsed successfully.\n");
return NULL;
}
return doc;
}
// 在文档doc中解析xpath表达式,返回结果集指针
xmlXPathObjectPtr getnodeset(xmlDocPtr doc, xmlChar *xpath)
{
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if(context == NULL)
{
printf("Error in xmlXPathNewContent\n");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context); // 在context中解析表达式xpath
xmlXPathFreeContext(context); // 释放context
if(result == NULL)
{
printf("Error in xmlXPathEvalExpression\n");
return NULL;
}
if(xmlXPathNodeSetIsEmpty(result->nodesetval)) // 解析表达式的结果集为空
{
xmlXPathFreeObject(result);
printf("No result\n");
return NULL;
}
return result;
}
void CoorReadXmlDoc(xmlDocPtr doc, xmlNodePtr cur)
{
xmlChar *key,*type;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if(xmlStrcmp(cur->name, (const xmlChar*) "coor_x")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "coor_y")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "bind_device_mac")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
type = xmlGetProp(cur, (const xmlChar*) "type"); // 获取属性值
printf(" type=%s\t", type);
printf(" key=%s\n", (char*)key);
}
else
{
printf("CoorReadXmlDoc error=%s!\n",cur->name);
}
cur = cur->next;
}
}
void ZoneReadXmlDoc(xmlDocPtr doc, xmlNodePtr cur)
{
xmlChar *key,*type;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if(xmlStrcmp(cur->name, (const xmlChar*) "coordinate")==0)
{
printf("cur->name = %s\n", cur->name);
CoorReadXmlDoc(doc,cur);
}
else
{
printf("ZoneReadXmlDoc error=%s!\n",cur->name);
}
cur = cur->next;
}
}
// 解析xmlPath路径的结点
void ReadXmlDoc(char *filepath, char *xmlPath)
{
xmlDocPtr doc = getdoc(filepath);
if(NULL == doc)
return ;
int i;
xmlChar *key;
xmlChar *xpath = (xmlChar*) xmlPath;
xmlXPathObjectPtr result = getnodeset(doc, xpath); // 获取结果集
if(result)
{
xmlNodeSetPtr nodeset = result->nodesetval;
xmlChar *name, *value,*type;
printf("nodeset->nodeNr = %d\n", nodeset->nodeNr); // 打印结果集中结点个数
for(i= 0; i < nodeset->nodeNr; i++)
{
xmlNodePtr cur = nodeset->nodeTab[i]; // products
name = xmlGetProp(cur, (const xmlChar*) "name");
// 获取属性值
printf("cur->name@ = %s, name = %s\n", cur->name,name);
cur = cur->xmlChildrenNode;
while(cur)
{
if(xmlStrcmp(cur->name, (const xmlChar*) "carport_info")==0)
{
printf("cur->name = %s\n", cur->name);
ReadXmlDoc(filepath, "/carport/carport_info");
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "carport_x")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "carport_y")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "zone_num")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
printf("-----------------\n");
}
//////////////////////////////////////////////
else if(xmlStrcmp(cur->name, (const xmlChar*) "zone_group")==0) // cur->name不为"text"
{
printf("cur->name = %s\n", cur->name);
ReadXmlDoc(filepath, "/carport/zone_group");
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "zone")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
name = xmlGetProp(cur, (const xmlChar*) "name");
// 获取属性值
printf(" name=%s\n", name);
//CoorReadXmlDoc(filepath, "/carport/zone_group/zone/coordinate");
ZoneReadXmlDoc(doc,cur);
printf("***************\n");
}
cur = cur->next;
}
printf("\n");
}
xmlXPathFreeObject(result);
}
xmlFreeDoc(doc);
xmlCleanupParser();
}
int main(void)
{
char curDir[100] = {0};
char docname[100] = {0};
GetCurDir(curDir);
strcpy(docname, curDir);
strcat(docname, "/CreatedXml.xml");
ReadXmlDoc(docname, "/carport");
return EXIT_SUCCESS;
}
搞了一天终于把XML的多级解析搞定,心酸!
<?xml version="1.0"?>
<carport name="bochiot company">
<carport_info name="carport_name">
<carport_x>100</carport_x>
<carport_y>200</carport_y>
<zone_num>2</zone_num>
</carport_info>
<zone_group name="zone_group">
<zone id="101" name="zone1">
<coordinate>
<coor_x>1</coor_x>
<coor_y>2</coor_y>
<bind_device_mac type="1">AAAAAAAAAAAA</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>3</coor_x>
<coor_y>4</coor_y>
<bind_device_mac type="0">BBBBBBBBBBBB</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>5</coor_x>
<coor_y>6</coor_y>
</coordinate>
</zone>
<zone id="102" name="zone2">
<coordinate>
<coor_x>7</coor_x>
<coor_y>8</coor_y>
<bind_device_mac type="1">CCCCCCCCCCCC</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>9</coor_x>
<coor_y>10</coor_y>
<bind_device_mac type="0">DDDDDDDDDDDD</bind_device_mac>
</coordinate>
<coordinate>
<coor_x>1</coor_x>
<coor_y>5</coor_y>
</coordinate>
</zone>
</zone_group>
</carport>
--------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
int GetCurFilePath(char *lpOut) // get full path of the executable file
{
char chPath[BUFSIZ] = {0};
int nRetVal = readlink("/proc/self/exe", chPath, sizeof(chPath)); // get full path of the current-executable file
if(nRetVal < 0)
{
strcpy(lpOut, ".");
return -1;
}
else
{
strcpy(lpOut, chPath);
return 0;
}
}
int GetCurDir(char *lpOut) // get directory-path of current executable-file
{
char chPath[BUFSIZ] = { 0 };
if( GetCurFilePath(chPath) < 0 )
return - 1;
dirname(chPath); // dirname will change value of "chPath"(contain result)
strcpy(lpOut, chPath); // copy result to out-param
return 0;
}
xmlDocPtr getdoc(char *docname) // 根据文件名得到文档指针
{
xmlDocPtr doc;
xmlKeepBlanksDefault(0);
doc = xmlParseFile(docname);
if(doc == NULL)
{
fprintf(stderr, "Document not parsed successfully.\n");
return NULL;
}
return doc;
}
// 在文档doc中解析xpath表达式,返回结果集指针
xmlXPathObjectPtr getnodeset(xmlDocPtr doc, xmlChar *xpath)
{
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if(context == NULL)
{
printf("Error in xmlXPathNewContent\n");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context); // 在context中解析表达式xpath
xmlXPathFreeContext(context); // 释放context
if(result == NULL)
{
printf("Error in xmlXPathEvalExpression\n");
return NULL;
}
if(xmlXPathNodeSetIsEmpty(result->nodesetval)) // 解析表达式的结果集为空
{
xmlXPathFreeObject(result);
printf("No result\n");
return NULL;
}
return result;
}
void CoorReadXmlDoc(xmlDocPtr doc, xmlNodePtr cur)
{
xmlChar *key,*type;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if(xmlStrcmp(cur->name, (const xmlChar*) "coor_x")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "coor_y")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "bind_device_mac")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
type = xmlGetProp(cur, (const xmlChar*) "type"); // 获取属性值
printf(" type=%s\t", type);
printf(" key=%s\n", (char*)key);
}
else
{
printf("CoorReadXmlDoc error=%s!\n",cur->name);
}
cur = cur->next;
}
}
void ZoneReadXmlDoc(xmlDocPtr doc, xmlNodePtr cur)
{
xmlChar *key,*type;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if(xmlStrcmp(cur->name, (const xmlChar*) "coordinate")==0)
{
printf("cur->name = %s\n", cur->name);
CoorReadXmlDoc(doc,cur);
}
else
{
printf("ZoneReadXmlDoc error=%s!\n",cur->name);
}
cur = cur->next;
}
}
// 解析xmlPath路径的结点
void ReadXmlDoc(char *filepath, char *xmlPath)
{
xmlDocPtr doc = getdoc(filepath);
if(NULL == doc)
return ;
int i;
xmlChar *key;
xmlChar *xpath = (xmlChar*) xmlPath;
xmlXPathObjectPtr result = getnodeset(doc, xpath); // 获取结果集
if(result)
{
xmlNodeSetPtr nodeset = result->nodesetval;
xmlChar *name, *value,*type;
printf("nodeset->nodeNr = %d\n", nodeset->nodeNr); // 打印结果集中结点个数
for(i= 0; i < nodeset->nodeNr; i++)
{
xmlNodePtr cur = nodeset->nodeTab[i]; // products
name = xmlGetProp(cur, (const xmlChar*) "name");
// 获取属性值
printf("cur->name@ = %s, name = %s\n", cur->name,name);
cur = cur->xmlChildrenNode;
while(cur)
{
if(xmlStrcmp(cur->name, (const xmlChar*) "carport_info")==0)
{
printf("cur->name = %s\n", cur->name);
ReadXmlDoc(filepath, "/carport/carport_info");
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "carport_x")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "carport_y")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "zone_num")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf(" key=%s\n", (char*)key);
printf("-----------------\n");
}
//////////////////////////////////////////////
else if(xmlStrcmp(cur->name, (const xmlChar*) "zone_group")==0) // cur->name不为"text"
{
printf("cur->name = %s\n", cur->name);
ReadXmlDoc(filepath, "/carport/zone_group");
}
else if(xmlStrcmp(cur->name, (const xmlChar*) "zone")==0)
{
printf("cur->name = %s\t", cur->name);
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
name = xmlGetProp(cur, (const xmlChar*) "name");
// 获取属性值
printf(" name=%s\n", name);
//CoorReadXmlDoc(filepath, "/carport/zone_group/zone/coordinate");
ZoneReadXmlDoc(doc,cur);
printf("***************\n");
}
cur = cur->next;
}
printf("\n");
}
xmlXPathFreeObject(result);
}
xmlFreeDoc(doc);
xmlCleanupParser();
}
int main(void)
{
char curDir[100] = {0};
char docname[100] = {0};
GetCurDir(curDir);
strcpy(docname, curDir);
strcat(docname, "/CreatedXml.xml");
ReadXmlDoc(docname, "/carport");
return EXIT_SUCCESS;
}
搞了一天终于把XML的多级解析搞定,心酸!
相关文章推荐
- Linux socket 初步
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量