tinyxml刪除,新增,修改xml檔案
阿新 • • 發佈:2019-01-13
TinyXML是一個簡單的、小的、最小的、C
+ + XML解析器,可以很容易地整合到其他專案。它讀取XML和XML文件建立c++物件代表。可以操縱的物件,再次改變,並儲存為XML。
下面說下使用: xml內容格式如下: <?xml version="1.0" encoding="GBK" ?> <config> <libs> <item id="0"> <charact T="1" m="測試"/> <table>基地發源地</table> </item>
<item id="1">
<charact T="2" m="哈哈"/>
<table>你快遞</table>
</item>
</libs>
</config>
找到節點的位置介面:
bool GetNodePointerByName(TiXmlElement* pRootEle,char *strNodeName,const char *id, TiXmlElement*
&Node)
{
下面說下使用: xml內容格式如下: <?xml version="1.0" encoding="GBK" ?> <config> <libs> <item id="0"> <charact T="1" m="測試"/> <table>基地發源地</table> </item>
//TiXmlElement *pElement = myDocument->RootElement();if (NULL == pRootEle)
return false;
TiXmlElement *temproot = pRootEle; pRootEle = pRootEle->FirstChild("libs")->ToElement(); for (temproot = pRootEle->FirstChildElement();temproot;temproot = temproot->NextSiblingElement())
if (0 == strcmp(libid,temproot->Attribute("libid"))){
Node = temproot;return true;
}
return false;} 1.刪除<item>........ </item>這樣一個節點。 xmlpath是xml檔案的路徑,strNodeName是節點的名字,此處是item,id就是區分是哪一個節點要用的。 bool del_node(const char *xmlpath,char *strNodeName,const char *id) {
bool flags = false; TiXmlDocument *pDoc = new TiXmlDocument(); if (NULL==pDoc) {
goto END;
} pDoc->LoadFile(xmlpath); TiXmlElement *pRootEle = pDoc->RootElement(); if (NULL==pRootEle) {
goto END;
} TiXmlElement *pNode = NULL; GetNodePointerByName(pRootEle, strNodeName,id, pNode);//獲取節點的位置。 // 假如是根節點 if (pRootEle==pNode) {
if(pDoc->RemoveChild(pRootEle)){
pDoc->SaveFile(xmlpath);goto END;
}else
goto END;
} // 假如是其它節點 if (NULL!=pNode) {
TiXmlNode *pParNode = pNode->Parent();if (NULL==pParNode){
goto END;
}TiXmlElement* pParentEle = pParNode->ToElement();if (NULL!=pParentEle){
if(pParentEle->RemoveChild(pNode))//刪除節點
pDoc->SaveFile(xmlpath);//儲存
else
goto END;
}
} else {
goto END;
} flags = true; END: if (pDoc != NULL) {
delete pDoc;
} return flags;} 2.修改節點的內容 通過id查詢到需要修改的節點,然後遍歷整個節點,把需要修改的地方SetValue新的值,最後儲存 bool modifynode_attribute(const char *xmlpath,const char *id,char *strNodeName,char *T,char *m,char *table) {
TiXmlDocument *pDoc = new TiXmlDocument(); if (NULL==pDoc) {
return false;
} pDoc->LoadFile(xmlpath); TiXmlElement *pRootEle = pDoc->RootElement(); if (NULL==pRootEle) {
delete pDoc;return false;
} TiXmlElement *pNode = NULL; GetNodePointerByName(pRootEle,strNodeName,id,pNode); if (NULL!=pNode) {
char *name = "";pNode = pNode->FirstChildElement();TiXmlAttribute* pAttr = NULL;for (pAttr = pNode->FirstAttribute(); pAttr; pAttr = pAttr->Next()) //遍歷父節點的所有子節點{
name = (char *)pAttr->Name();if(strcmp(name, "id") == 0 ){
pAttr->SetValue(id);
}else if (strcmp(name, "T") == 0 ){
pAttr->SetValue(T);
}else if (strcmp(name, "m") == 0 ){
pAttr->SetValue(m);
}
}pNode = pNode->NextSiblingElement();pNode->FirstChild()->SetValue(table);pDoc->SaveFile(xmlpath);delete pDoc;return true;
} else {
delete pDoc;return false;
}} 3.新增節點 實現新增節點,先找到你要新增節點的位置,然後把你要新增的子節點,事先給建立好,在這就是<item>.....</item>,最後就使用InsertEndChild,把新建的子節點插入到想加的位置。 bool IS_get_tableinfo::addnode(const char *XmlFile,char *strNodeName, const char *id, char *T, char *m, char *table) {
// 定義一個TiXmlDocument類指標 TiXmlDocument *pDoc = new TiXmlDocument(); if (NULL==pDoc) {
return false;
} pDoc->LoadFile(XmlFile); TiXmlElement *pRootEle = pDoc->RootElement(); if (NULL==pRootEle) {
delete pDoc;return false;
} // TiXmlElement *pNode = NULL; //GetNodePointerByName(pRootEle,strNodeName,id,pNode); TiXmlElement *pElement = pDoc->RootElement(); if (NULL == pElement) {
delete pDoc;return false;
} pElement = pElement->FirstChild("libs")->ToElement();//找到父節點libs位置 if (NULL!=pElement) {
// 建立新增的子節點:pNewNodeTiXmlElement *pNewNode = new TiXmlElement(strNodeName);if (NULL==pNewNode){
delete pDoc;return false;
}// 設定節點的屬性值,然後插入節點