您的位置:首页 > 运维架构 > Linux

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 linux c