修改节点其实和查询指定节点的值有点类似,也分为两个函数,一个实现修改文本。另一个负责修改属性。
/*
!
* /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文件:
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,我们可以这样用:
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);
下面是增加节点的两个函数:
/*
!
* /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
;
}
来源:http://blog.csdn.net/lujianxin1098/article/details/5866669