我不知道如何在C++中使用tinyxml2读取这个xml文件
<?xml version="1.0" encoding="utf-8"?>
<empleados>
<cantidad>UnaCantidad</cantidad>
<empleado>
<idEmpleado>1</idEmpleado>
<nombre>UnNombre1</nombre>
<apellidos>UnosApellidos1</apellidos>
</empleado>
<empleado>
<idEmpleado>2</idEmpleado>
<nombre>UnNombre2</nombre>
<apellidos>UnosApellidos2</apellidos>
</empleado>
</empleados>
这就是我现在所做的,不起作用:
tinyxml2::XMLDocument xml_doc;
tinyxml2::XMLError eResult = xml_doc.LoadFile(xml_path);
XMLCheckResult(eResult);
tinyxml2::XMLNode* root = xml_doc.FirstChild();
if (root == nullptr) return tinyxml2::XML_ERROR_FILE_READ_ERROR;
tinyxml2::XMLElement* element = root->FirstChildElement("cantidad");
if (element == nullptr) return tinyxml2::XML_ERROR_PARSING_ELEMENT;
int xml_count;
eResult = element->QueryIntText(&xml_count);
XMLCheckResult(eResult);
Empleado* empleados= Empleado[xml_count];
element = root->FirstChildElement("empleado");
Empleado e;
int i = 0;
while (element != nullptr && i < xml_count)
{
tinyxml2::XMLElement* item = element->FirstChildElement("idEmpleado");
int id;
eResult = item->QueryIntText(&id);
XMLCheckResult(eResult);
item = element->FirstChildElement("nombre");
string nombre = item->Gettext();
item = element->FirstChildElement("apellidos");
string apellidos = item->Gettext();
e = Empleado();
e.id = id;
e.nombre = nombre;
e.apellidos = apellidos;
empleados[i] = e;
element = element->NextSiblingElement("empleado");
i++;
}
当我尝试获取第一个XMLElement (cantidad)时,我获得了一个nullptr。我做错了什么,请帮帮我...
发布于 2015-04-03 18:28:04
这是因为FirstChild为您提供了XML头。
以下是您正在执行的操作的简化示例:
#include "tinyxml2.h"
bool Test()
{
tinyxml2::XMLDocument xml_doc;
tinyxml2::XMLError eResult = xml_doc.LoadFile("test.xml");
if (eResult != tinyxml2::XML_SUCCESS) return false;
tinyxml2::XMLNode* root = xml_doc.FirstChild();
if (root == nullptr) return false;
tinyxml2::XMLElement* element = root->FirstChildElement("cantidad");
if (element == nullptr) return false;//Fails here
return true;
}
int main()
{
Test();
}
并且它会在指示的地方失败。这是现在工作的部分:
#include "tinyxml2.h"
bool Test()
{
tinyxml2::XMLDocument xml_doc;
tinyxml2::XMLError eResult = xml_doc.LoadFile("test.xml");
if (eResult != tinyxml2::XML_SUCCESS) return false;
tinyxml2::XMLNode* root = xml_doc.FirstChildElement("empleados");
if (root == nullptr) return false;
tinyxml2::XMLElement* element = root->FirstChildElement("cantidad");
if (element == nullptr) return false;
return true;
}
int main()
{
Test();
}
它之所以有效,是因为它通过名称获取子代,而不是FirstChild。我不知道其他的情况;但是现在你已经知道了,从那以后你应该会很好。
希望这能有所帮助!
https://stackoverflow.com/questions/29435870
复制