Lectura de una matriz de datos desde XML.
Estoy descargando una matriz de datos desde un objeto с++ a un archivo XML. ¿Cómo puedo obtener datos de su atributo (en mi caso, el atributo se llama “Data”), y guardar el resultado en un búfer para una manipulación de datos posterior?
Estoy utilizando la biblioteca TinyXml.
Función que guarda un objeto (ver el resultado en XML a continuación)
TiXmlDocument doc("text.xml");
if (!doc.LoadFile())
return false;
TiXmlHandle hDoc(&doc);
TiXmlElement* elem;
TiXmlHandle hRoot(0);
elem = hDoc.FirstChildElement().Element();
if (!elem) return false;
std::string name = elem->Value();
hRoot = TiXmlHandle(elem);
TiXmlElement* chunkbranch = new TiXmlElement("ChunkBranch");
root->LinkEndChild(chunkbranch);
for (int x = 0; x < this->mapChunk.size(); x++)
{
for (int y = 0; y < this->mapChunk[x].size(); y++)
{
TiXmlElement* chunk;
chunk = new TiXmlElement("Chunk");
chunkbranch->LinkEndChild(chunk);
chunk->SetAttribute("posX", x);
chunk->SetAttribute("posY", y);
TiXmlElement* chunkdata;
chunkdata = new TiXmlElement("ChunkData");
chunk->LinkEndChild(chunkdata);
chunkdata->SetAttribute("data", this->mapChunk[x][y]->getChunkAsString().c_str());
//quizá se pueda utilizar otro método para guardar los datos
}
}
Aquí llamo al atributo “ChunkData”. Aquí intento obtener los valores de la matriz “ChunkBranch” >> “ChunkData” >> datos
elem = hRoot.FirstChild("ChunkBranch").FirstChild().Element();
for (elem; elem; elem = elem->NextSiblingElement())
{
std::string buff("");
buff = elem->Value();
if (buff == "Chunk")
{
int buffX;
int xKey = elem->QueryIntAttribute("posX", &buffX);
int yKey = elem->QueryIntAttribute("posY", &buffX);
this->mapChunk[xKey][yKey] = &Chunk(sf::Vector2f(xKey,yKey));
std::cout << "En chunk:\t" << xKey << " x " << yKey << "\n";
TiXmlElement* cData;
cData = elem->FirstChildElement("ChunkData");
int test;
const char* pKey = cData->Value();
const char* xke = cData->GetText();
cData->QueryIntAttribute("data", &test);//en algún lugar de aquí el programa no devuelve la matriz
//y pKey = 0 (no NULL, solo 0), después de la carga se detendrá
}
}
Datos XML:
<?xml version="1.0" ?>
<base>
<chunkbranch>
<chunk posx="0" posy="0">
<chunkdata data="0 19 0 0 0 0 0 19 0 0 0 0 0 0 19 19 0 0 0 0 0 "></chunkdata>
</chunk>
<chunk posx="0" posy="1">
<chunkdata data="0 0 0 0 0 0 0 0 19 0 0 0 0 0 19 0 0 0 0 0 0 19 19 0 0 0 0 0 "></chunkdata>
</chunk>
</chunkbranch>
davy.ai
Para obtener los datos del atributo “Data” en el elemento “ChunkData” del archivo XML, se puede utilizar la función
QueryIntAttribute
oQueryStringAttribute
de la librería TinyXml. Aquí se muestra un ejemplo de cómo hacerlo:Este código obtiene el elemento “ChunkData”, luego obtiene el valor del atributo “Data” y lo convierte en una cadena de caracteres. A continuación, crea un stringstream a partir de la cadena y lee los valores de datos de él en un bucle. Puede manipular los valores de datos de la manera que desee dentro del bucle.
Nota: La función
QueryIntAttribute
se utiliza para obtener el valor de un atributo entero, no de un atributo de cadena como “Data”.