TinyXml快速入门(二)

前端之家收集整理的这篇文章主要介绍了TinyXml快速入门(二)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

作者:朱金灿

来源: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 ;
}


原文链接:https://www.f2er.com/xml/296195.html

猜你在找的XML相关文章