No.15 Xcode(5.1.x) libxml2

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

//
// http://www.cnblogs.com/qq78292959/archive/2012/05/11/2496327.html
//
// 1.先在Framework中加入libxml2.dylib
// 2.在"Header Search Path"中加入"${SDK_ROOT}/usr/include/libxml2"
// 3.包含头文件"libxml2/libxml/parser.h"和"libxml2/libxml/tree.h"
//

void saveXml()
{
    // 生成文档头(初始化)
    xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
    
    // 生成career节点(根节点)
    xmlNodePtr career = xmlNewNode(NULL, BAD_CAST "career");
    xmlDocSetRootElement(doc, career);
    
    // 生成career的子节点
    xmlNodePtr warrior = xmlNewNode(NULL, BAD_CAST "warrior");
    xmlAddChild(career, warrior);

    xmlNodePtr wizards = xmlNewNode(NULL, BAD_CAST "wizards");
    xmlAddChild(career, wizards);
    
    // 生成warrior的子节点
    xmlNodePtr saber_player = xmlNewTextChild(warrior, NULL, BAD_CAST "player", BAD_CAST "saber");
    xmlSetProp(saber_player, BAD_CAST "str", BAD_CAST "80");
    xmlSetProp(saber_player, BAD_CAST "ini", BAD_CAST "63");
    
    // 生成mage的子节点
    xmlNodePtr lin_player = xmlNewTextChild(wizards, NULL, BAD_CAST "player", BAD_CAST "lin");
    xmlSetProp(lin_player, BAD_CAST "str", BAD_CAST "10");
    xmlSetProp(lin_player, BAD_CAST "ini", BAD_CAST "53");
    
    xmlNodePtr red_player = xmlNewTextChild(wizards, NULL, BAD_CAST "player", BAD_CAST "red");
    xmlSetProp(red_player, BAD_CAST "str", BAD_CAST "20");
    xmlSetProp(red_player, BAD_CAST "ini", BAD_CAST "73");
    
    // 写入文件
    int ret = xmlSaveFile("./career.xml", doc);
    if (ret != -1)
    {
        printf("create a xml:%dbytes\n", ret);
    }
    
    // 释放资源
    xmlFreeDoc(doc);
}

int loadXml()
{
    // 加载文件(初始化)
    xmlDocPtr doc = xmlParseFile("./career.xml");
    if(doc == NULL)
    {
        printf("parse failed!\n");
        return -1;
    }
    
    // 取得career节点
    xmlNodePtr career = xmlDocGetRootElement(doc);
    
    // 遍历career的子节点
    for (xmlNodePtr careerChild = career->children; careerChild; careerChild = careerChild->next)
    {
        // 找到warrior节点
        if (xmlStrcasecmp(careerChild->name, BAD_CAST "warrior") == 0)
        {
            
        }
        // 找到wizards节点
        else if (xmlStrcasecmp(careerChild->name, BAD_CAST "wizards") == 0)
        {
            // 遍历wizards的子节点
            for(xmlNodePtr wizardsChild = careerChild->children; wizardsChild; wizardsChild = wizardsChild->next)
            {
                // 找到player节点
                if (xmlStrcasecmp(wizardsChild->name, BAD_CAST "player") == 0)
                {
                    xmlChar* str = xmlGetProp(wizardsChild, BAD_CAST "str");
                    xmlChar* ini = xmlGetProp(wizardsChild, BAD_CAST "ini");
                    xmlChar* txt = xmlNodeGetContent(wizardsChild);
                    
                    printf("player: str = %s ini = %s txt = %s\n", (char*)str, (char*)ini, (char*)txt);
                    
                    xmlFree(str);
                    xmlFree(ini);
                    xmlFree(txt);
                }
            }
        }
    }
    
    // 完成解析, 释放资源
    xmlFreeDoc(doc);
    
    return 0;
}

int main(int argc, const char * argv[])
{
    saveXml();
    loadXml();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值