在C++中使用tinyxml2读取一个xml文件

Read an xml file using tinyxml2 in C++

本文关键字:一个 文件 xml 读取 C++ tinyxml2      更新时间:2023-10-16

我不知道如何在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。我做错了什么,请帮帮我…

这是因为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,而是通过名称获取子项。其余的我不知道;但现在你有了,你应该从那里开始就没事了。

希望能有所帮助!

相关文章: