xml 解析

xml 解析

1. 重要结构体
typedef struct _xmlNode xmlNode;
typedef xmlNode *xmlNodePtr;
struct _xmlNode {
    void           *_private;/* application data */
    xmlElementType   type;   /* type number, must be second ! */
    const xmlChar   *name;      /* the name of the node, or the entity */
    struct _xmlNode *children; /* parent->childs link */
    struct _xmlNode *last;   /* last child link */
    struct _xmlNode *parent;/* child->parent link */
    struct _xmlNode *next;   /* next sibling link */
    struct _xmlNode *prev;   /* previous sibling link */
    struct _xmlDoc *doc;/* the containing document */
    /* End of common part */
    xmlNs           *ns;        /* pointer to the associated namespace */
    xmlChar         *content;   /* the content */
    struct _xmlAttr *properties;/* properties list */
    xmlNs           *nsDef;     /* namespace definitions on this node */
    void            *psvi;/* for type/PSVI informations */
    unsigned short   line;   /* line number */
    unsigned short   extra; /* extra data for XPath/XSLT */
};
2. 常用api
xmlDocPtr xmlParseFile(const char * filename)// 加载xml文件到内存DOM,使用完用xmlFreeDoc()释放
xmlSaveFormatFileEnc(const char * filename,  xmlDocPtr cur, const char * encoding, int format)//将内存中DOM树保存到xml文件
xmlDocPtr xmlParseMemory(const char * buffer, int size)//将内存中的xml数据生成DOM,使用完也要用xmlFreeDoc()释放
void xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar ** doc_txt_ptr,int * doc_txt_len, const char * txt_encoding, int format)  //将DOM树导出到内存中,形成一个XML格式的数据
xmlDocPtr xmlNewDoc (const xmlChar * version)//在内存中创建一个新的XML文档。所创建的文档需要使用xmlFreeDoc()来释放资源
void xmlFreeDoc(xmlDocPtr cur)//释放内存中的XML文档
xmlNodePtr xmlDocGetRootElement(xmlDocPtr doc)//获得根节点
xmlNodePtr xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root)//设置根节点
xmlChar * xmlNodeGetContent  (xmlNodePtr cur)//获得节点的内容
void xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar * content,  int len)//设置节点的内容长度
void xmlNodeAddContentLen(xmlNodePtr cur,  const xmlChar * content,  int len)//在节点的内容后面添加新的内容
xmlChar * xmlGetProp(xmlNodePtr node, const xmlChar * name)//获得节点的属性
xmlAttrPtr xmlSetProp(xmlNodePtr node, const xmlChar * name, const xmlChar * value)//设置节点的属性(如果该属性已经存在,则替换其值)
xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc)//生成xpath的上下文关系句柄.该返回句柄由函数内部申请,此函数调用者需要用xmlXPathFreeContext来释放
void xmlXPathFreeContext(xmlXPathContextPtr ctxt)//释放xpath的上下文关系句柄
xmlXPathObjectPtr  xmlXPathEvalExpression (const xmlChar * str,xmlXPathContextPtr ctxt)//执行xpath的表达式,返回结果内容节点集合.该返回句柄由函数内部申请,此函数调用者需要用xmlXPathFreeObject()来释放
void xmlXPathFreeObject(xmlXPathObjectPtr obj)//释放xpath表达式运算结果集
//根节点相关函数
xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc) //获取文档根节点
xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root) //设置文档根节点
 
//创建子节点相关函数
xmlNodePtr xmlNewNode (xmlNsPtr ns, const xmlChar * name) //创建新节点
xmlNodePtr xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar * name, const xmlChar * content) //创建新的子节点
xmlNodePtr xmlCopyNode (const xmlNodePtr node, int extended) //复制当前节点
 
//添加子节点相关函数
xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) //给指定节点添加子节点
xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) //添加后一个兄弟节点
xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) //添加前一个兄弟节点
xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) //添加兄弟节点
 
//属性相关函数
xmlAttrPtr xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //创建新节点属性
xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name) //读取节点属性
xmlAttrPtr xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //设置节点属性
others:
<libxml/parser.h>
 int xmlKeepBlanksDefault (int val) //设置是否忽略空白节点,比如空格,在分析前必须调用,默认值是0,最好设置成1。
xmlDocPtr xmlParseFile (const char * filename) //分析一个xml文件,并返回一个文档对象指针
 
<libxml/tree.h>
//xml操作的基础结构提及其指针类型
//xmlDoc  xmlDocPtr 文档对象的结构体及其指针
//xmlNode xmlNodePtr 节点对象的结构体及其指针
//xmlAttr xmlAttrPtr 节点属性的结构体及其指针
//xmlNs xmlNsPtr 节点命名空间的结构及其指针
 //作用同尾部同名的字符串函数。只不过针对相应的xml节点
xmlChar* xmlStrcat (xmlChar *cur, const xmlChar * add)
const xmlChar *xmlStrchr(const xmlChar * str, xmlChar val)
int xmlStrcmp (const xmlChar * str1, const xmlChar * str2)
int xmlStrlen (const xmlChar * str)
xmlChar *xmlStrncat (xmlChar * cur, const xmlChar * add, int len)
int xmlStrncmp (const xmlChar * str1, const xmlChar * str2, int len)
const xmlChar *xmlStrstr (const xmlChar * str, const xmlChar * val)
3. xml解析
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>


/* 解析文档 */
static void parse_file(char *xml_file, char *parse_node)
{
    /* 定义文档和节点指针 */
    xmlDocPtr file;
    xmlNodePtr parent_node;
    xmlNodePtr cur_node;
    xmlChar* key;

    /* 进行解析,如果没成功,显示一个错误并停止 */
    file = xmlParseFile(xml_file);
    if(file == NULL){
        fprintf(stderr, "xml file not parse successfully. \n");
        return;
    }

    /* 获取文档根节点,若无内容则释放文档树并返回 */
    parent_node = xmlDocGetRootElement(file);
    if(parent_node == NULL){
        fprintf(stderr, "empty document\n");
        goto end;
    }

    /* 遍历文档树 */
    parent_node = parent_node->xmlChildrenNode;
    while(parent_node != NULL)
    {
        cur_node = parent_node->xmlChildrenNode;
        while(cur_node != NULL)
        {
            /* 找到目标子节点 */
            if(!xmlStrcmp(cur_node->name, (const xmlChar *)parse_node))
            {
                //key = xmlNodeListGetString(file, cur_node->xmlChildrenNode, 1);
                key = xmlNodeGetContent(cur_node);
                printf("%s: %s\n",parse_node, key);
                xmlFree(key);
                goto end;
            }
            cur_node = cur_node->next; /* 下一个子节点 */
        }
        parent_node = parent_node->next; /* 下一个父节点 */
    }
    printf("this child node is not exist\n");

end:
    xmlFreeDoc(file); /* 释放文档树 */
    return;
}

int main(int argc, char **argv)
{
    if(argc != 3){
        printf("Parse node from xml file\n", argv[0]);
        printf("Usage: %s xml_file parse_node\n", argv[0]);
        exit(1);
    }
    parse_file(argv[1], argv[2]);

    return 0;
}
4.xml 生成
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

int main(int argc, char **argv)
{
    if(argc != 2)
    {
        printf("Create xml file\n");
        printf("Usage: %s file_name\n", argv[0]);
        exit(1);
    }

    //定义文档和节点指针
    xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");

    xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");

    //设置根节点
    xmlDocSetRootElement(doc,root_node);

    //在根节点中直接创建节点
    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");

    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content");

    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");

    //创建一个节点,设置其内容和属性,然后加入根结点
    xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2");

    xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT");

    xmlAddChild(root_node,node);

    xmlAddChild(node,content);

    xmlNewProp(node,BAD_CAST"attribute",BAD_CAST "yes");

    //创建一个儿子和孙子节点
    node = xmlNewNode(NULL, BAD_CAST "son");

    xmlAddChild(root_node,node);

    xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST "grandson");

    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "This is a grandson node"));

    //存储xml文档
    int ret = xmlSaveFormatFileEnc(argv[1], doc, "UTF-8", 1);
    if (ret != -1)
    {
       printf("create xml file, write %d bytes\n", ret);
    }

    //释放文档内节点动态申请的内存
    xmlFreeDoc(doc);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值