xml解析

7 篇文章 0 订阅
 /**
 * 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值