• XML_CPP_libXml2_VC6_Code_ZC


    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:C_IDEVC_3rdlibxml2libxml2-2.6.30.win32include
    //    (1.2)    E:C_IDEVC_3rdlibxml2libxml2-2.6.30.win32lib
    //    (2.1)    E:C_IDEVC_3rdlibxml2iconv-1.9.2.win32include
    //    (2.2)    E:C_IDEVC_3rdlibxml2iconv-1.9.2.win32lib
    //    (3.1)    E:C_IDEVC_3rdlibxml2zlib-1.2.3.win32include
    //    (3.2)    E:C_IDEVC_3rdlibxml2zlib-1.2.3.win32lib
    
    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个字节
    ", 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.
    ");
            return;
        }
    
        curNode = xmlDocGetRootElement(doc); //确定文档根元素
    
        /*检查确认当前文档中包含内容*/
        if (NULL == curNode)
        {
            printf("Empty document
    ");
            xmlFreeDoc(doc);
            return;
        }
    
        /*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/
        if (xmlStrcmp(curNode->name, BAD_CAST "root"))
        {
            printf("document of the wrong type, root node != root
    ");
            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
    ", 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
    ", szAttr);
                xmlFree(szAttr);
            }
            attrPtr = attrPtr->next;
        }
    
        xmlFreeDoc(doc);
    }

    3、

    4、

    5、

  • 相关阅读:
    destroy-method="close"
    2.2 Spring的结构组成--Spring源码深度解析
    2.1 Spring容器的基本实现--Spring源码深度解析
    1.2 Spring环境搭建--Spring源码深度解析
    1.1 Spring的整体架构--Spring源码深度解析
    迟到的2016年计划
    spring学习 之helloworld
    从零实现DNN 探究梯度下降的原理
    Java注解——这些@圈圈都是个啥?
    自动发送日报,骗过你的领导^-^
  • 原文地址:https://www.cnblogs.com/cppskill/p/9076324.html
Copyright © 2020-2023  润新知