现在的位置: 首页 > 综合 > 正文

xml解析

2014年01月04日 ⁄ 综合 ⁄ 共 2857字 ⁄ 字号 评论关闭
 /**
 * 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

抱歉!评论已关闭.