es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener los datos del atributo “Data” en el elemento “ChunkData” del archivo XML, se puede utilizar la función QueryIntAttribute o QueryStringAttribute de la librería TinyXml. Aquí se muestra un ejemplo de cómo hacerlo:

    TiXmlElement* cData;
    cData = elem->FirstChildElement("ChunkData");
    
    const char* pData = cData->Attribute("data"); // obtener el valor del atributo "Data"
    std::string dataString(pData); // convertirlo a una cadena de caracteres
    std::istringstream dataStream(dataString); // crear un stringstream a partir de la cadena
    int dataValue;
    
    while (dataStream >> dataValue) { // leer los valores de datos del stringstream
        // hacer algo con los datos
    }
    

    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”.

Comments are closed.