下边的类只为了纯粹的遍历所有的节点而编写:
class readXml
{
public:
readXml()
{
doc.LoadFile("D:\\test.tag");
root = doc.RootElement();
//加载xml文件的方式二
//TiXmlDocument mydoc(path);//xml文档对象
//bool loadOk = mydoc.LoadFile();//加载文档
//loadOk 等于true加载成功
}
void td(TiXmlElement* tmp)
{
std::string s = tmp->Value();//标签的名称
const char* p = tmp->GetText();//文本内容
std::string tt(p ? p : tmp->FirstAttribute()->Value());
std::cout << "标签:" << s <<" :";
if (NULL != p)
{
std::cout << p ;
}
std::cout << std::endl;
TiXmlAttribute *pAttr = tmp->FirstAttribute();//第一个属性
if (NULL != pAttr)
{
std::cout << "属性:";
while (NULL != pAttr) //输出所有属性
{
std::cout << pAttr->Name() << ":" << pAttr->Value() << " ";
pAttr = pAttr->Next();
}
std::cout << std::endl;
}
if (tmp->FirstChildElement())
{
readXml::t(tmp->FirstChildElement());
}
if (tmp->NextSiblingElement())
{
td(tmp->NextSiblingElement());
}
}
void readXml::t(TiXmlElement* tmp)
{
std::string s = tmp->Value();
const char* p = tmp->GetText();
std::string tp(p ? p : tmp->FirstAttribute()->Value());
std::cout << "标签:"<<s << " :";
if (NULL != p)
{
std::cout << p ;
}
std::cout << std::endl;
TiXmlAttribute *pAttr = tmp->FirstAttribute();//第一个属性
if (NULL != pAttr)
{
std::cout << "属性:";
while (NULL != pAttr) //输出所有属性
{
std::cout << pAttr->Name() << ":" << pAttr->Value() << " ";
pAttr = pAttr->Next();
}
std::cout << std::endl;
}
if (tmp->FirstChildElement())
{
t(tmp->FirstChildElement());
}
if (tmp->NextSiblingElement())
{
td(tmp->NextSiblingElement());
}
}
TiXmlElement* getRoot()
{
return root;
}
~readXml();
private:
TiXmlDocument doc;//文档指针
TiXmlElement* root;//根节点
std::vector<TiXmlElement*> tmpSibling;
};
在正常的软件开发时我们自己的配置文件常常都有一定的规律和格式,所以我们不需要全部这样遍历,我们可以将一些属性归结成结构体,然后利用标签将这些属性表示出来,直接利用:
TiXmlElement* tmp = root->FirstChildElement("标签名");//找到对应的标签
auto ret = tmp->Attribute("属性名");//获得属性值
这样的表示方法就可以避免了循环的出现,减少冗余