XML_CPP_libXml2_VC6_Code_ZC XML_CPP_资料_libXml2_01_Code_ZC(?.pro)

ZC:iconv.dll、libxml2.dll、zlib1.dll 放到 exe所在目录下

1、代码来源于 帖子:XML_CPP_资料_libXml2_01_Code_ZC(?.pro)

2、代码:

#include <stdio.h>
#include <windows.h>

#include <libxml/parser.h>
#include <libxml/tree.h>

#pragma comment(lib, "libxml2.lib")
#pragma comment(lib, "iconv.lib")
#pragma comment(lib, "zlib.lib")

// VC6--> Tools --> Options --> Directories --> "Include files" & "Library files" 中添加目录:
//    (1.1)    E:\ZC_IDE\VC_3rd\libxml2\libxml2-2.6.30.win32\include
//    (1.2)    E:\ZC_IDE\VC_3rd\libxml2\libxml2-2.6.30.win32\lib
//    (2.1)    E:\ZC_IDE\VC_3rd\libxml2\iconv-1.9.2.win32\include
//    (2.2)    E:\ZC_IDE\VC_3rd\libxml2\iconv-1.9.2.win32\lib
//    (3.1)    E:\ZC_IDE\VC_3rd\libxml2\zlib-1.2.3.win32\include
//    (3.2)    E:\ZC_IDE\VC_3rd\libxml2\zlib-1.2.3.win32\lib

void CreateZ();
void ParserZ();

void main()
{
    //CreateZ();
    ParserZ();
}

// ZC: 创建xml文档
void CreateZ()//    void MainWindow::on_pbtnTest01_clicked()
{
    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 nRel = xmlSaveFile("CreatedXml.xml", doc);
    if (nRel != -1)
    {
        printf("一个xml文档被创建, 写入%d个字节\n", nRel);
    }

    //释放文档内节点动态申请的内存

    xmlFreeDoc(doc);
}

// ZC: 解析xml文档
void ParserZ()//    void MainWindow::on_pbtnParserXML_clicked()
{
    xmlDocPtr doc;           //定义解析文档指针
    xmlNodePtr curNode;      //定义结点指针(你需要它为了在各个结点间移动)
    xmlChar *szKey;          //临时字符串变量

    char *szDocName = "CreatedXml.xml";
    doc = xmlReadFile(szDocName, "GB2312", XML_PARSE_RECOVER); //解析文件

    //检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
    //一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。
    //如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中.

    if (NULL == doc)
    {
        printf("Document not parsed successfully.\n");
        return;
    }

    curNode = xmlDocGetRootElement(doc); //确定文档根元素

    /*检查确认当前文档中包含内容*/
    if (NULL == curNode)
    {
        printf("Empty document\n");
        xmlFreeDoc(doc);
        return;
    }

    /*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/
    if (xmlStrcmp(curNode->name, BAD_CAST "root"))
    {
        printf("document of the wrong type, root node != root\n");
        xmlFreeDoc(doc);
        return;
    }

    curNode = curNode->xmlChildrenNode;
    xmlNodePtr propNodePtr = curNode;
    while(curNode != NULL)
    {
        //取出节点中的内容
        if ((!xmlStrcmp(curNode->name, (const xmlChar *)"newNode1")))
        {
            szKey = xmlNodeGetContent(curNode);
            printf("newNode1: %s\n", szKey);
            xmlFree(szKey);
        }

        //查找带有属性attribute的节点
        if (xmlHasProp(curNode,BAD_CAST "attribute"))
        {
            propNodePtr = curNode;
        }

        curNode = curNode->next;
    }

    //查找属性
    xmlAttrPtr attrPtr = propNodePtr->properties;
    while (attrPtr != NULL)
    {
        if (!xmlStrcmp(attrPtr->name, BAD_CAST "attribute"))
        {
            xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "attribute");
            printf("get attribute = %s\n", szAttr);
            xmlFree(szAttr);
        }
        attrPtr = attrPtr->next;
    }

    xmlFreeDoc(doc);
}

3、

4、

5、

猜你喜欢

转载自www.cnblogs.com/cppskill/p/9076324.html