/**
* 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