xml解析

来源:互联网 发布:logitech摄像头软件 编辑:程序博客网 时间:2024/04/26 11:44
 /**
 * section: Tree
 * synopsis: Navigates a tree to print element names
 * purpose: Parse a file to a tree, use xmlDocGetRootElement() to
 *          get the root element, then walk the document and print
 *          all the element name in document order.
 * usage: tree1 filename_or_URL
 * test: tree1 test2.xml > tree1.tmp ; diff tree1.tmp tree1.res ; rm tree1.tmp
 * author: Dodji Seketeli
 * copy: see Copyright for the status of this software.
 */




/*
 *编译此文件可用以下选项
 *gcc -o t `xml2-config --cflags` t.c `xml2-config --libs`
 *gcc `xml2-config --cflags --libs` -o xmlexample libxml2-example.c
*/





#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>



xmlDoc *doc = NULL;

struct cCall
{
    char* cStep;
    char* cNumber;
    char* cFile;
    char* cGoType;
    char* cGoStep;
};

struct cCall myCall;

/*获取节点的属性值*/
void getProperties (xmlDocPtr doc, xmlNodePtr cur,char* tStep,char* tNumber) {

cur = cur->xmlChildrenNode;
char* mStep;
char* mNumber;

while (cur != NULL)
{
    if ((!xmlStrcmp(cur->name, (const xmlChar *)"I")))
    {
        mStep = xmlGetProp(cur, "step");
        mNumber = xmlGetProp(cur, "number");
        if(strcmp(mStep,tStep)==0 && strcmp(mNumber,tNumber)==0)
        {
            myCall.cStep = mStep;
            myCall.cNumber = mNumber;
            myCall.cFile = xmlGetProp(cur, "file");
            myCall.cGoType = xmlGetProp(cur, "gotype");
            myCall.cGoStep = xmlGetProp(cur, "gostep");
        
            /*printf(":::::::::::: %s:::%s:::%s:::%s:::%s/n", myCall.cStep,myCall.cNumber,myCall.cFile,myCall.cGoType,myCall.cGoStep);
            xmlFree(myCall.cStep);
            xmlFree(myCall.cNumber);
            xmlFree(myCall.cFile);
            xmlFree(myCall.cGoType);
            xmlFree(myCall.cGoStep);*/
        }
    }
    cur = cur->next;
}

return;
}


/**
 *获取节点名称:
 */
static void print_element_names(xmlNode * a_node)
{
    xmlNode *cur_node = NULL;

    for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
        if (cur_node->type == XML_ELEMENT_NODE)
        {
            //获取此节点属性值
            getProperties(doc,cur_node,"3","2");
        }
        print_element_names(cur_node->children);
    }
}



void dealXML(char *fileName)
{
    xmlNode *root_element = NULL;    
  /*
     * 初始化和检测版本的正确性.
     */
    LIBXML_TEST_VERSION;

    /* 解析文件并获取文档树结构 */
    doc = xmlReadFile(fileName, NULL, 0);

    if (doc == NULL) {
        printf("错误:不能正确解析此文件,文件格式不正确,或是文件未找到 %s/n", fileName);
    }

    /*获取文档根节点 */
    root_element = xmlDocGetRootElement(doc);

    /*打印节点*/
    print_element_names(root_element);
    

    /* 释放文档 */
    xmlFreeDoc(doc);

    /*
     *释放可能由解析器分配的环境变量
     */
    xmlCleanupParser();

}




#ifdef LIBXML_TREE_ENABLED
/**
 * 解析xml文档,并打印节点.
 */
int main(int argc, char **argv)
{
    char* fileName;
    char c;
    
    //如果没有输入需要解析的xml,那么就用call.xml
    if (argc < 2)
    {
        fileName="call.xml";
        //return(0);
  }
      else
  {
          fileName=argv[1];
  }
 
    while(c=getchar())
    {
        if(c!='/n')
      {
              if(c!='q')
          {
                  printf("OO/n");
          }
              else
          {
                  break;
          }              
      }
  }
  dealXML(fileName);
 
  return 0;
}
#else
int main(void) {
    fprintf(stderr, "Tree support not compiled in/n");
    exit(1);
}
#endif


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我儿子不爱说话怎么办 宝宝不爱学说话怎么办 宝宝误食了面霜怎么办 幼儿发烧不吃饭怎么办 宝宝发烧不吃饭怎么办 宝宝发烧不吃奶怎么办 新生儿用枕头了怎么办 新生儿宝宝奶睡怎么办 幼儿不爱吃水果怎么办 孩子不张个子怎么办 宝宝抗拒吃水果怎么办 夏天化妆爱出汗怎么办 上火嘴皮起泡怎么办 儿童拒绝吃水果怎么办 婴儿的牙长歪了怎么办 小孩吃东西不嚼怎么办 宝宝不爱吃苹果怎么办 宝宝吃猕猴桃拉肚子怎么办 宝宝吃猕猴桃过敏怎么办 怀孕了不想喝水怎么办 新生宝宝脾气大怎么办 一岁半宝宝痰多怎么办 孩子不吃水果蔬菜怎么办 宝宝感冒肚子响怎么办 大人不爱吃水果怎么办 孩子什么都不吃怎么办 儿童脾胃虚便秘怎么办 孩子不喜欢吃青菜怎么办 宝宝不喜欢吃青菜怎么办 儿童不爱吃水果怎么办 吃水果怕凉怎么办 受凉了发低烧怎么办 小孩受凉发低烧怎么办 出汗吹风发烧了怎么办 宝宝发烧闹人怎么办 感冒发烧出汗后怎么办 宝宝不爱吃蔬菜水果怎么办 小孩不爱吃蔬菜水果怎么办 一岁宝宝爱含饭怎么办 2岁宝宝爱含饭怎么办 吃药吃多了怎么办