加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

TinyXml快速入门(三)

发布时间:2020-12-16 06:09:15 所属栏目:百科 来源:网络整理
导读:作者:朱金灿 来源: http://www.cnblogs.com/clever101 在《 TinyXml 快速入门(二) 》介绍使用 tinyxml 库获取 xml 文件声明,查询指定节点、删除指定节点的做法。在本文中继续介绍 修改指定节点和增加节点的做法。 修改节点其实和查询指定节点的值有点类

作者:朱金灿

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


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

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

/* !
*brief修改指定节点的文本。
*
*paramXmlFilexml文件全路径。
*paramstrNodeName指定的节点名。
*paramstrText重新设定的文本的值
*return是否成功。true为成功,false表示失败。
*/
bool ModifyNode_Text( const std:: string & XmlFile, string & strNodeName,255)">string & strText)
{
// 定义一个TiXmlDocument类指针
TiXmlDocument * pDoc = new TiXmlDocument();
if (NULL == pDoc)
{
return false ;
}

pDoc
-> LoadFile(XmlFile);
TiXmlElement
* pRootEle = pDoc -> RootElement();
if (NULL == pRootEle)
{
false ;
}

TiXmlElement
* pNode = NULL;

GetNodePointerByName(pRootEle,strNodeName,pNode);

if (NULL != pNode)
{
pNode
-> Clear(); 首先清除所有文本
然后插入文本,保存文件
TiXmlText * pValue = new TiXmlText(strText);
pNode
-> LinkEndChild(pValue);
pDoc
-> SaveFile(XmlFile);
true ;
}
else
false ;
}


!
*brief修改指定节点的属性值。
*
*paramXmlFilexml文件全路径。
*paramstrNodeName指定的节点名。
*paramAttMap重新设定的属性值,这是一个map,前一个为属性名,后一个为属性值
*return是否成功。true为成功,false表示失败。
bool ModifyNode_Attribute( const std::map < std:: string ,std:: string > & AttMap)
{
typedefstd::pair
< std:: string > String_Pair;

false ;
}

TiXmlElement
* pNode = NULL;
GetNodePointerByName(pRootEle,255)">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 > ::const_iteratoriter;
for (iter = AttMap.begin();iter != AttMap.end();iter ++ )
{
if (strAttName == iter -> first)
{
pAttr
-> SetValue(iter -> second);
}
}

}
pDoc
-> SaveFile(XmlFile);
else
{
false ;
}

}

对于ModifyNode_Attribute函数,这里稍微介绍一下如何使用,比如对于下面这样一个xml文件:

<? xmlversion="1.0"encoding="utf-8"standalone="yes" ?>
< MyApp >
Messages Welcome > WelcometoMyApp </ Farewell > ThankyouforusingMyApp Windows Window name ="MainFrame" x ="5" y ="15" w ="400" h ="250" />
Connection ip ="192.168.0.1" timeout ="123.456000" >

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

std:: string XmlFile = _T( " E:TestTinyxmlexample4.xml " );
std::
string strNodeName = _T( Connection " );
typedefstd::pair
< std:: string > String_Pair;
std::map
< std:: string > AttMap;
AttMap.insert(String_Pair(_T(
ip " ),_T( 192.168.0.100 " )));
AttMap.insert(String_Pair(_T(
timeout 1000 " )));
ModifyNode_Attribute(XmlFile,AttMap);

下面是增加节点的两个函数:

!
*brief增加指定节点的文本。
*
*paramXmlFilexml文件全路径。
*paramstrParNodeName要增加的节点的父节点。
*paramstrNodeName指定的节点名。
*paramstrText要增加的文本
*return是否成功。true为成功,false表示失败。
bool AddNode_Text( string & strParNodeName,strParNodeName,255)">if (NULL != pNode)
{
生成子节点:pNewNode
TiXmlElement * pNewNode = new TiXmlElement(strNodeName);
if (NULL == pNewNode)
{
false ;
}
设置节点文本,然后插入节点
TiXmlText * pNewValue = new TiXmlText(strText);
pNewNode
-> LinkEndChild(pNewValue);

pNode
-> InsertEndChild( * pNewNode);
pDoc
-> SaveFile(XmlFile);
false ;

}

!
*brief增加节点。
*
*paramXmlFilexml文件全路径。
*paramstrParNodeName要增加的节点的父节点。
*paramstrNodeName指定的节点名。
*paramAttMap要增加的节点设定的属性值,这是一个map,前一个为属性名,后一个为属性值
*return是否成功。true为成功,false表示失败。
bool AddNode_Attribute( string strNodeName,255)">string > & AttMap)
{
设置节点的属性值,然后插入节点
std::map < std:: for (iter = AttMap.begin();iter != AttMap.end();iter ++ )
{
pNewNode
-> SetAttribute(iter -> first,iter -> second);
}

pNode
-> InsertEndChild( * pNewNode);
pDoc
-> SaveFile(XmlFile);
false ;
}

代码修改记录: 2010.04.08.在上面各个函数的参数增加const修饰符。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读