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文件目录

  • 相关阅读:
    USACO1.3.3Calf Flac
    USACO1.3.1Mixing Milk
    USACO1.3.2Barn Repair
    USACO2.1.4Healthy Holsteins
    USACO1.5.2Prime Palindromes
    USACO1.4.2The Clocks
    USACO2.1.2Ordered Fractions
    PHP关联数组教程
    你的服务器没有正确响应Token验证的解决方法
    微信公众平台消息接口开发(10)语音触发(非识别)
  • 原文地址:https://www.cnblogs.com/dorothychai/p/2395922.html
Copyright © 2011-2022 走看看