TinyXml快速入门(三)

来源:互联网 发布:迅雷9登录网络错误 编辑:程序博客网 时间:2024/05/18 23:25

作者:朱金灿

来源:http://www.cnblogs.com/clever101

原文:http://www.cnblogs.com/clever101/archive/2010/04/08/1707812.html

 

      在《TinyXml快速入门(二)》介绍使用tinyxml库获取xml文件声明,查询指定节点、删除指定节点的做法。在本文中继续介绍修改指定节点和增加节点的做法。

 

  修改节点其实和查询指定节点的值有点类似,也分为两个函数,一个实现修改文本。另一个负责修改属性。

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/*!*  \brief 修改指定节点的文本。**  \param XmlFile xml文件全路径。*  \param strNodeName 指定的节点名。*  \param strText 重新设定的文本的值*  \return 是否成功。true为成功,false表示失败。*/bool ModifyNode_Text(const std::string& XmlFile,const std::string& strNodeName,const std::string& strText){    // 定义一个TiXmlDocument类指针    TiXmlDocument *pDoc = new TiXmlDocument();    if (NULL==pDoc)    {        return false;    }    pDoc->LoadFile(XmlFile);    TiXmlElement *pRootEle = pDoc->RootElement();    if (NULL==pRootEle)    {        return false;    }    TiXmlElement *pNode = NULL;    GetNodePointerByName(pRootEle,strNodeName,pNode);    if (NULL!=pNode)    {        pNode->Clear();  // 首先清除所有文本        // 然后插入文本,保存文件        TiXmlText *pValue = new TiXmlText(strText);        pNode->LinkEndChild(pValue);        pDoc->SaveFile(XmlFile);        return true;    }    else        return false;}/*!*  \brief 修改指定节点的属性值。**  \param XmlFile xml文件全路径。*  \param strNodeName 指定的节点名。*  \param AttMap 重新设定的属性值,这是一个map,前一个为属性名,后一个为属性值*  \return 是否成功。true为成功,false表示失败。*/bool ModifyNode_Attribute(const std::string& XmlFile,const std::string& strNodeName,                 const std::map<std::string,std::string> &AttMap){    typedef std::pair <std::string,std::string> String_Pair;    // 定义一个TiXmlDocument类指针    TiXmlDocument *pDoc = new TiXmlDocument();    if (NULL==pDoc)    {        return false;    }    pDoc->LoadFile(XmlFile);    TiXmlElement *pRootEle = pDoc->RootElement();    if (NULL==pRootEle)    {        return false;    }     TiXmlElement *pNode = NULL;    GetNodePointerByName(pRootEle,strNodeName,pNode);    if (NULL!=pNode)    {        TiXmlAttribute* pAttr = NULL;         std::string strAttName = _T("");        std::string strAttValue = _T("");        for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next())          {              strAttName = pAttr->Name();            std::map<std::string,std::string>::const_iterator iter;            for (iter=AttMap.begin();iter!=AttMap.end();iter++)            {                if (strAttName==iter->first)                {                    pAttr->SetValue(iter->second);                }            }        }          pDoc->SaveFile(XmlFile);        return true;    }    else    {        return false;    }}
对于ModifyNode_Attribute函数,这里稍微介绍一下如何使用,比如对于下面这样一个xml文件:

<pre name="code" class="html">Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?xml version="1.0" encoding="utf-8" standalone="yes" ?><MyApp>    <Messages>        <Welcome>Welcome to MyApp</Welcome>        <Farewell>Thank you for using MyApp</Farewell>    </Messages>    <Windows>        <Window name="MainFrame" x="5" y="15" w="400" h="250" />    </Windows>    <Connection ip="192.168.0.1" timeout="123.456000" /></MyApp>



我们如果要修改节点的Connection的ip为192.168.0.100,timeout为1000,我们可以这样用:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->    std::string XmlFile = _T("E:\\TestTinyxml\\example4.xml");    std::string strNodeName = _T("Connection");   typedef std::pair <std::string,std::string> String_Pair;   std::map<std::string,std::string> AttMap;   AttMap.insert(String_Pair(_T("ip"),_T("192.168.0.100")));   AttMap.insert(String_Pair(_T("timeout"),_T("1000")));   ModifyNode_Attribute(XmlFile,strNodeName,AttMap);
下面是增加节点的两个函数:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/*!*  \brief 增加指定节点的文本。**  \param XmlFile xml文件全路径。*  \param strParNodeName 要增加的节点的父节点。*  \param strNodeName 指定的节点名。*  \param strText 要增加的文本*  \return 是否成功。true为成功,false表示失败。*/bool AddNode_Text(const std::string& XmlFile,const std::string& strParNodeName,const std::string& strNodeName,const std::string& strText){    // 定义一个TiXmlDocument类指针    TiXmlDocument *pDoc = new TiXmlDocument();    if (NULL==pDoc)    {        return false;    }    pDoc->LoadFile(XmlFile);    TiXmlElement *pRootEle = pDoc->RootElement();    if (NULL==pRootEle)    {        return false;    }    TiXmlElement *pNode = NULL;    GetNodePointerByName(pRootEle,strParNodeName,pNode);    if (NULL!=pNode)    {        // 生成子节点:pNewNode        TiXmlElement *pNewNode = new TiXmlElement(strNodeName);        if (NULL==pNewNode)        {            return false;        }        // 设置节点文本,然后插入节点        TiXmlText *pNewValue = new TiXmlText(strText);        pNewNode->LinkEndChild(pNewValue);        pNode->InsertEndChild(*pNewNode);        pDoc->SaveFile(XmlFile);        return true;    }    else         return false;    }/*!*  \brief 增加节点。**  \param XmlFile xml文件全路径。*  \param strParNodeName 要增加的节点的父节点。*  \param strNodeName 指定的节点名。*  \param AttMap 要增加的节点设定的属性值,这是一个map,前一个为属性名,后一个为属性值*  \return 是否成功。true为成功,false表示失败。*/bool AddNode_Attribute(const std::string& XmlFile,const std::string& strParNodeName,const std::string strNodeName,const std::map<std::string,std::string> &AttMap){    // 定义一个TiXmlDocument类指针    TiXmlDocument *pDoc = new TiXmlDocument();    if (NULL==pDoc)    {        return false;    }    pDoc->LoadFile(XmlFile);    TiXmlElement *pRootEle = pDoc->RootElement();    if (NULL==pRootEle)    {        return false;    }    TiXmlElement *pNode = NULL;    GetNodePointerByName(pRootEle,strParNodeName,pNode);    if (NULL!=pNode)    {        // 生成子节点:pNewNode        TiXmlElement *pNewNode = new TiXmlElement(strNodeName);        if (NULL==pNewNode)        {            return false;        }        // 设置节点的属性值,然后插入节点        std::map<std::string,std::string>::const_iterator iter;        for (iter=AttMap.begin();iter!=AttMap.end();iter++)        {             pNewNode->SetAttribute(iter->first,iter->second);        }        pNode->InsertEndChild(*pNewNode);        pDoc->SaveFile(XmlFile);        return true;    }    else        return false;}



0 0