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

TinyXml快速入门(二)

发布时间:2020-12-16 08:56:43 所属栏目:百科 来源:网络整理
导读:作者:朱金灿 来源: http://www.cnblogs.com/clever101 在《 TinyXml 快速入门(一) 》中我介绍了使用 TinyXml 库如何创建和打印 xml 文件,下面我介绍 使用tinyxml库对xml文件进行一系列的操作,包括获取xml文件声明,查询指定节点、删除指定节点、修改指

作者:朱金灿

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

在《TinyXml快速入门(一)》中我介绍了使用TinyXml库如何创建和打印xml文件,下面我介绍使用tinyxml库对xml文件进行一系列的操作,包括获取xml文件声明,查询指定节点、删除指定节点、修改指定节点和增加节点的用法。在TinyXml快速入门(一)》中我们知道xml文件中的一个节点元素实际包含两种值:属性和文本。其中属性在我看来可以看作是STL中的map,一个属性带一个属性值,map中也是一个键带一个键值。因此查询指定节点、删除指定节点和增加节点必然是需要实现两种方法,删除指定节点只需要实现一种方法。鉴于内容较多,在本文中介绍获取xml文件声明,查询指定节点、删除指定节点的做法,修改指定节点和增加节点的做法在后续的文章介绍。

首先是获取xml文件声明。xml文件声明包括三方面的内容:Version、Standalone和Encoding。其源码如下:

/* !
*brief获取xml文件的声明。
*
*paramXmlFilexml文件全路径。
*paramstrVersionVersion属性值
*paramstrStandaloneStandalone属性值
*paramstrEncodingEncoding属性值
*return是否成功。true为成功,false表示失败。
*/
bool GetXmlDeclare(std:: string XmlFile,
std::
string & strVersion,255)">string & strStandalone,255)">string & strEncoding)
{
// 定义一个TiXmlDocument类指针
TiXmlDocument * pDoc = new TiXmlDocument();
if (NULL == pDoc)
{
return false ;
}

pDoc
-> LoadFile(XmlFile);

TiXmlNode
* pXmlFirst = pDoc -> FirstChild();
if (NULL != pXmlFirst)
{
TiXmlDeclaration
* pXmlDec = pXmlFirst -> ToDeclaration();
if (NULL != pXmlDec)
{
strVersion
= pXmlDec -> Version();
strStandalone
= pXmlDec -> Standalone();
strEncoding
= pXmlDec -> Encoding();
}
}
true ;
}

我们发现无论查询节点、删除节点、修改节点和增加节点,其实都离不开一个函数,就是根据节点名获取相关节点指针。那么我们就先实现一个根据节点名获取节点指针的函数:

!
*brief通过根节点和节点名获取节点指针。
*
*parampRootElexml文件的根节点。
*paramstrNodeName要查询的节点名
*paramNode需要查询的节点指针
*return是否找到。true为找到相应节点指针,false表示没有找到相应节点指针。
bool GetNodePointerByName(TiXmlElement * pRootEle,std:: string & strNodeName,TiXmlElement * & Node)
{
假如等于根节点名,就退出
if (strNodeName == pRootEle -> Value())
{
Node
= pRootEle;
true ;
}

TiXmlElement
* pEle = pRootEle;
for (pEle = pRootEle -> FirstChildElement();pEle;pEle = pEle -> NextSiblingElement())
{
递归处理子节点,获取节点指针 if (GetNodePointerByName(pEle,strNodeName,Node))
true ;
}

false ;
}

有了这个函数,我们就很容易实现查询节点的相应文本或属性值。

!
*brief通过节点查询。
*
*paramXmlFilexml文件全路径。
*paramstrNodeName要查询的节点名
*paramstrText要查询的节点文本
*return是否成功。true为成功,false表示失败。
bool QueryNode_Text(std:: string strNodeName,255)">string & strText)
{
false ;
}

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

TiXmlElement
* pNode = NULL;
GetNodePointerByName(pRootEle,pNode);
if (NULL != pNode)
{
const char * psz = pNode -> GetText();
if (NULL == psz)
{
strText
= _T( "" );
}
else
{
strText
= psz;
}
true ;
}
else
{
false ;
}

}


!
*brief通过节点查询。
*
*paramXmlFilexml文件全路径。
*paramstrNodeName要查询的节点名
*paramAttMap要查询的属性值,这是一个map,前一个为属性名,后一个为属性值
*return是否成功。true为成功,false表示失败。
bool QueryNode_Attribute(std:: < std:: string ,255)">string > & AttMap)
{

typedefstd::pair < std:: string > String_Pair;

TiXmlDocument
* pDoc = false ;
}

TiXmlElement
* pNode = NULL;

GetNodePointerByName(pRootEle,pNode);

if (NULL != pNode)
{
TiXmlAttribute
* pAttr = NULL;
for (pAttr = pNode -> FirstAttribute();pAttr;pAttr = pAttr -> Next())
{
std::
string strAttName = pAttr -> Name();
std::
string strAttValue = pAttr -> Value();
AttMap.insert(String_Pair(strAttName,strAttValue));
}
false ;
}
下面是删除指定节点的函数,其中考虑了删除根节点的情况。

!
*brief删除指定节点的值。
*
*paramXmlFilexml文件全路径。
*paramstrNodeName指定的节点名。
*return是否成功。true为成功,false表示失败。
bool DelNode(std:: string strNodeName)
{
假如是根节点 if (pRootEle == pNode)
{
if (pDoc -> RemoveChild(pRootEle))
{
pDoc
-> SaveFile(XmlFile);
else
false ;
}

假如是其它节点 if (NULL != pNode)
{
TiXmlNode
* pParNode = pNode -> Parent();
if (NULL == pParNode)
{
false ;
}

TiXmlElement
* pParentEle = pParNode -> ToElement();
if (NULL != pParentEle)
{
if (pParentEle -> RemoveChild(pNode))
pDoc
-> SaveFile(XmlFile);
false ;
}
}
false ;
}


(编辑:李大同)

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

    推荐文章
      热点阅读