1:用程序打开xml文件
该xml文件的名称是“Base.xml”,用CString strFileName存储
TiXmlDocument *XMLDoc = 0;
TiXmlElement *XMLRoot;
//如果不进行字符串的转换,会打不开文件
CStringA pt = CT2A(strFileName);
XMLDoc = new TiXmlDocument(pt);
bool loadOk=XMLDoc->LoadFile();
if( !loadOk )
{
delete XMLDoc;
return false;
}
delete XMLDoc;
return true;
2:循环读取xml文件中的内容
首先需要获取根节点的信息
XMLRoot = XMLDoc->RootElement();
再进行读取
TiXmlElement *pElement = nullptr;
pElement = XMLRoot->FirstChildElement("InterrInfo");
while(pElement)
{
pElement = pElement->NextSiblingElement("InterrInfo");
}
目前,我只是给出了最简单的读取形式,如果有其他需要可以对这个循环进行扩展。
3:查找指定的节点。
无论是插入数据、删除数据、还是修改数据内容。都避免不了的需要找到需要插入的位置。
目前,我把查找这个功能写成了一个函数,方便多次调用。
如果有需要可以进行借鉴。
bool CMyXmlDlg::FindNode(TiXmlElement *XmlNodeParent , TiXmlElement* & XmlNode , TiXmlElement* &XmlParent,NodeInfoST nodeInfo)
{
TiXmlElement *pElement;
pElement = XmlNodeParent->FirstChildElement("InterrInfo");
while(pElement)
{
XmlParent = XmlNodeParent;
int nID = getAttribFloat_ID(pElement,"ID");
if (nID == nodeInfo.nID)
{
XmlNode = pElement;
return true;
}
else
{
if(FindNode(pElement, XmlNode ,XmlParent ,nodeInfo) == true)
{
break;
return true;
}
else
pElement = pElement->NextSiblingElement("InterrInfo");
}
}
return false;
}
上面代码的主要意思是:在xml文件中循环查找。当找到我传入的NodeInfoST结构体中的ID和当前ID相同时,返回节点指针以及该节点对应的父节点。
4:插入数据
在根据上面的函数找到对应的节点后,进行数据的插入
//因为要插入数据,所以需要在查找的位置,也就是pNode位置,重新创建出一个节点
TiXmlElement *PersonElement = new TiXmlElement("InterrInfo");
pNode->LinkEndChild(PersonElement);
//插入数据。如果该数据是int类型,不需要进行类型转换
PersonElement->SetAttribute("ID",ChildInfo.nID);
//如果插入的数据是CStirng类型,不进行转换会出现乱码错误。
//主要原因是编码问题。
//在此,我用了UCS 转成utf8 格式。如果有需要,可以查看我的“类型转换”中。里面有详细转换方式。仅供参考
CString strQuestion = L"测试例子";
CStringA strAQuestion = CT2A(strQuestion);
UcsToUtf8(strQuestion,strAQuestion);
PersonElement->SetAttribute("Question",strAQuestion);
5:删除数据
bool flag = pParentNode->RemoveChild(pNode);
查找到对应的节点,直接删除就可以。
6:修改节点的数据
此时的做法和插入数据的方法类似。只是不需要创建新的节点。只是修改数据就行了。
使用SetAttribute修改数据
7:保存修改的内容
bool isFlage = XMLDoc->SaveFile(ptPathName);
当isFlage == true时,表示保存成功了
对于C++程序中的xml操作,每次进行操作后,都需要对改动的内容进行保存。