我想用TinyXML从一个xml文件中解析一些数据。
下面是我的text.xml文件内容:
<?xml version="1.0" encoding="iso-8859-1"?>
<toto>
<tutu>
<tata>
<user name="toto" pass="13" indice="1"/>
<user name="tata" pass="142" indice="2"/>
<user name="titi" pass="azerty" indice="1"/>
</tata>
</tutu>
</toto>
我想访问第一个元素'user'。方法如下:
TiXmlDocument doc("test.xml");
if (doc.LoadFile())
{
TiXmlNode *elem = doc.FirstChildElement()->FirstChildElement()->FirstChildElement()->FirstChildElement();
std::cout << elem->Value() << std::endl;
}
在输出中:用户。
但是代码非常难看,而且不通用。我尝试了下面的代码来模拟与上面代码相同的行为,但是它不起作用,并且发生了错误。
TiXmlElement *getElementByName(TiXmlDocument &doc, std::string const &elemt_value)
{
TiXmlElement *elem = doc.FirstChildElement(); //Tree root
while (elem)
{
if (!std::string(elem->Value()).compare(elemt_value))
return (elem);
elem = elem->NextSiblingElement();
}
return (NULL);
}
也许我错过了库中的一个特殊函数,可以完成这项工作(getElementByName函数)。我只是想获得一个指向元素的指针,其中的值是我正在寻找的。有人可以帮助我吗?提前感谢您的帮助。
5条答案
按热度按时间xyhw6mcr1#
试试这个
o7jaxewo2#
阿迪的答案没有工作时,我只是复制粘贴到我的代码,但我修改了它,现在它为我工作的罚款。因为我做了相当多的变化,我想我应该张贴我的最终代码在这里。
(for如何调用函数:
s3fp2yjn3#
还可以使用递归函数和lamda-function作为处理程序,逐个遍历XML元素。
用法:只需将XML根元素和您的数据处理器lambda函数传递给递归Parser-function即可。
z9ju0rcb4#
//上面给出的解决方案中的一个小调整
qyuhtwio5#
实际上,您希望找到第一个“toto/tutu/tata/user”。
您认为第一个“user”是“toto/tutu/user”还是“toto/user”?在您的示例中,使用TiXmlHandle可以使事情变得更容易。TiXmlHandle::Child()、TiXmlHandle::FirstChild()、TiXmlHandle::ChildElement()检查参数是否为NULL。
为了更方便,考虑使用tinyxpath。在那里,您可以通过字符串“/toto/tutu/tata/user”找到您的元素。或者简单地“*/user”表示遇到的第一个“user”。