最近,是用xml比較多。但是網上的這方面的資料特別少。我就自己弄了個。。使用的是tinyxml類,他具體怎麼用可以看我另一篇博文。
c++ 使用TinyXml讀寫Xml
這裡有簡單的實例包括編譯,下面的程序,只是一個簡單的查詢過程,具體的還需要大家在用的時候去完成。我也是嘗試成功後就發布了。可能並不滿足大家的需要,大家拿去用,可能還要改改。。。。
我讀取的xml是
[html]
<?xml version="1.0" encoding="UTF-8"?>
<list>
<dict id="1" key="english" >
<key>english</key>
<acceptation>英語;英語語言;英格蘭人;(英國)純正英語;
</acceptation>
<pos>adj.</pos>
<acceptation>英格蘭的;英國的;英語的;用英語寫的;
</acceptation>
</dict>
<dict id="2" key="one" >
<key>one</key>
<acceptation>(數字)一;一個;(基數)一,第一;
</acceptation>
<pos>n.</pos>
<acceptation>一個人;一點鐘;一體;獨一;
</acceptation>
</dict>
<dict id="3" key="key" >
<key>key</key>
<pos>vt.</pos>
<acceptation>鍵入;鎖上;調節…的音調;提供線索;</acceptation>
</dict>
</list>
調用入口:
[html]
char *file = "egxml.xml";
TiXmlDocument xmlDoc(file);
xmlDoc.LoadFile();
TiXmlElement* pRootElement = xmlDoc.RootElement(); //獲取跟節點
TiXmlElement* pElesele = selectXml(pRootElement,"2","id"); //查找節點
string msg = "";
msg += dumpNode(pElesele,0); //讀取該節點所有數據
查找節點函數
[cpp] www.2cto.com
TiXmlElement* CegDlg::selectXml(TiXmlElement *pRootElement,string strVal,string strName) //跟目錄節點,查詢屬性值,查詢屬性
{
TiXmlElement* pEle = NULL;
string msg = "";
TiXmlElement* reEle = NULL; //用於返回
for (pEle = pRootElement->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement()) //循環下面所有節點
{
// recursive find sub node return node pointer
int t = pEle->Type();
TiXmlElement * pElement = pEle->ToElement(); //轉換至節點
TiXmlAttribute * pAttr = pElement->FirstAttribute(); //獲取第一個屬性
TiXmlAttribute * pNextAttr =NULL;
if(pAttr != NULL)
{
string tmpAttrVal = "";
string tmpAttrName = "";
do
{
tmpAttrVal = pAttr->Value(); //屬性值
tmpAttrName = pAttr->Name(); //屬性name
if(tmpAttrVal == strVal && tmpAttrName == strName)
{
return reEle = pElement; //找到就返回當前節點
break;
}
}while(pAttr = pAttr->Next()); //轉移到下一個屬性
}
}
return reEle;
}
讀取所有數據
[html]
string CegDlg::dumpNode(TiXmlNode * pNode,int flag)
{
string msg = "";
if(pNode == NULL)
{
return "";
}
TiXmlText * pText = NULL;
TiXmlNode * pChildNode = NULL;
int t = pNode->Type();
if(t == TiXmlText::TINYXML_TEXT) //節點類型是text節點
{
pText = pNode->ToText();
string text = pText->Value();
if(!text.empty())
{
msg = msg + "="+ text;
}
}
else if(t == TiXmlText::TINYXML_ELEMENT) //節點類型是Element
{
msg = msg + "rn";
int num = flag;
while(num >= 1)
{
msg = msg + "t";
num--;
}
msg = msg + pNode->Value();
//輸出屬性
TiXmlElement * pElement = pNode->ToElement();
TiXmlAttribute * pAttr = pElement->FirstAttribute();
TiXmlAttribute * pNextAttr =NULL;
string tmpAttrMsg = "[";
if(pAttr != NULL)
{
string tmpAttrVal = "";
string tmpAttrName = "";
do
{
tmpAttrVal = pAttr->Value();
tmpAttrName = pAttr->Name();
tmpAttrMsg += tmpAttrName+"=" + tmpAttrVal+","; //各個屬性之間用逗號分隔
}while(pAttr = pAttr->Next());
tmpAttrMsg = tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));
}
tmpAttrMsg += "]";
msg += tmpAttrMsg;
}
//循環訪問它的每一個元素
for(pChildNode=pNode->FirstChild();pChildNode!=0;pChildNode = pChildNode->NextSibling())
{
msg = msg + dumpNode(pChildNode,flag+1);
}
return msg;
}