zoukankan      html  css  js  c++  java
  • C++&&XML; “未使用调试信息生成二进制文件” vs assist

    C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,选用LIBXML2

    Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。

    Libxml2的下载地址是http://xmlsoft.org/

    windows版本的的下载地址是http://www.zlatkovic.com/libxml.en.html

    libxml2库依赖iconv和zlib库,所以需要下载三个

    成功版本libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。

    解压,在系统变量path中加上 iconv-1.9.2.win32\bin;zlib-1.2.3.win32\bin;libxml2-2.6.30.win32\bin这三个地址。或者把其中的三个dll到拷贝到system32目录中

    编译链接基于libxml2的程序,在VC环境中设置lib和include路径,并在link设置中添加libxml2.lib和iconv.lib.

    vc:项目->属性->c/c++->常规->附加包含目录,将三个文件夹的include下的.h头文件包含进工程

    项目->属性->链接器->常规->附加库目录,将三个文件夹的bin下的.lib库文件包含进工程

    注意,这只是将目录包含进工程,需要使用时需在代码中写

    #include <libxml/parser.h>(eg)

    #pragma   comment(lib,"libxml2.lib")(eg)


    实验代码如下

    /********************************************************************

        created:   2007/11/09

        created:   9:11:2007   15:34

        filename: CreateXmlFile.cpp

        author:       Wang xuebin

        depend:       libxml2.lib

        build:     nmake TARGET_NAME=CreateXmlFile

        purpose:   创建一个xml文件

    *********************************************************************/

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

    #include <stdio.h>

    #include <libxml/parser.h>

    #include <libxml/tree.h>

    #include <iostream>
    using namespace std;

    int main()

    {

        //定义文档和节点指针

        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)

        {

           cout<<"一个xml文档被创建,写入"<<nRel<<"个字节"<<endl;

        }

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

        xmlFreeDoc(doc);

        return 1;

    }

    创建一个xml文档其流程如下:

    l         用xmlNewDoc函数创建一个文档指针doc;

    l         用xmlNewNode函数创建一个节点指针root_node;

    l         用xmlDocSetRootElement将root_node设置为doc的根结点;

    l         给root_node添加一系列的子节点,并设置子节点的内容和属性;

    l         用xmlSaveFile将xml文档存入文件;

    l         用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。

    注意,有多种方式可以添加子节点:第一是用xmlNewTextChild直接添加一个文本子节点;第二是先创建新节点,然后用xmlAddChild将新节点加入上层节点。

    产生如下文件

    <?xml version="1.0" ?>
    - -<root>
    <       <newNode1>newNode1 content</newNode1>
    <       <newNode2>newNode2 content</newNode2>
    <        <newNode3>newNode3 content</newNode3>
    <        <node2 attribute="yes">NODE CONTENT</node2>
    -        -<son>
    <               <grandson>This is a grandson node</grandson>
           </son>
    </root>
    ——————————————————————————————————————————————————————————————————————————
    ——————————————————————————————————————————————————————————————————————————

    现在要说一下xml文件了,笔者要读取了xml有两种格式,一种
    <root>
    <node1>aaaaa</node1>
    <node2>bbbbb</node2>
    </root>
    一种
    <root>
    <node1 a="10">aaaaa</node1>
    <node2 b="20">bbbbb</node2>
    </root>

    整理一下,本文要读取的d.xml为
    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
    <node1 a="10">aaaaa</node1>
    <node2 b="20">bbbbb</node2>
    </root>
    目的为取出其它的 b的值和node2的属性值

    OK,开工
    #include <iostream>
    #include <libxml/parser.h>
    int main(int argc, char *argv[])
    {
        xmlDocPtr doc;           //定义解析文档指针
        xmlNodePtr curNode;      //定义结点指针(你需要它为了在各个结点间移动)
        xmlChar *szKey;          //临时字符串变量
        char szDocName[] = "d.xml";
        using std::string;
        using std::cout;
        using std::endl;
       
        doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析文件
        //检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
        //一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。
        //如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中.
        if (NULL == doc)
        {
           //文档打开错误
           return -1;
        }
        curNode = xmlDocGetRootElement(doc); //确定文档根元素
        /*检查确认当前文档中包含内容*/
        if (NULL == curNode)
        {
           //空得xml文件
           xmlFreeDoc(doc);
           return -2;
        }
        /*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/
        if (xmlStrcmp(curNode->name, BAD_CAST "root"))
        {
           //分析根元素失败
           xmlFreeDoc(doc);
           return -3;
        }
        curNode = curNode->xmlChildrenNode;
        xmlNodePtr propNodePtr = curNode;
        while(curNode != NULL)
        {
           //取出节点中的内容
           if ((!xmlStrcmp(curNode->name, (const xmlChar *)"node2")))
           {
               szKey = xmlNodeGetContent(curNode);
               cout << szKey << endl; //得到node2的值并输出
               xmlFree(szKey);
           }
           //查找带有属性attribute的节点
           if (xmlHasProp(curNode,BAD_CAST "b"))
           {
               propNodePtr = curNode;
           }
           curNode = curNode->next;
        }
        //查找属性
        xmlAttrPtr attrPtr = propNodePtr->properties;
        while (attrPtr != NULL)
        {
           if (!xmlStrcmp(attrPtr->name, BAD_CAST "b"))
           {
               xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "b");
               cout << szAttr << endl; //找到b的属性并输出
               xmlFree(szAttr);
           }
           attrPtr = attrPtr->next;
        }
        xmlFreeDoc(doc);
        return 0;
    }

    OK编译一下:
    g++ a.cpp -lxml2 -o a

    $./a
    bbbbb
    20
    成功得到所需要的值
    ————————————————————————————————————————————
    ————————————————————————————————————————————

    关于Vs 2005 中出现编译通过,但运行时出现“未使用调试信息生成二进制文件”的问题

    其实问题在于,在空项目中不生成调试文件pdb,所以无法调试。
    要让项目生成pdb文件,需要更改:
    项目属性,configuration properties->linker->Generate Debug Info 从 no 改为 yes
    但这样还是不够的,还需要更改:
    项目属性,configuration properties->c/c++->debug information format为/ZI
    项目属性,configuration properties->c/c++->optimization为Disabled
    因为为了生成这个文件,需要设定debug信息的格式并关掉O2,还要更改linker生成调试信息的开关
    —————————————————————————————————————————————
    —————————————————————————————————————————————

    在visual assist x的options的projects下的c/c++directions 下的custom stable include files中添加你的include文件目录

  • 相关阅读:
    如何在Ubuntu Server 18.04上安装Microsoft的Procmon
    如何在Ubuntu 20.04上安装Wine 5.0
    如何在Kali Linux 2020中启用SSH服务
    如何在Ubuntu 20.04 LTS Focal Fossa上安装Apache Groovy
    如何使用命令在Ubuntu 20.04 Linux上安装Vmware Tools
    在Ubuntu 20.04 LTS Focal Fossa上安装Zabbix Agent
    hdu 2089 不要62
    hdu 2093 成绩排名
    hdu 2104 hide handkerchief
    leetcode147对链表进行插入排序
  • 原文地址:https://www.cnblogs.com/dorothychai/p/2395922.html
Copyright © 2011-2022 走看看