elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  tinyXML c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: tinyXML c++  (Leído 1,378 veces)
statham

Desconectado Desconectado

Mensajes: 19



Ver Perfil
tinyXML c++
« en: 31 Enero 2019, 12:40 pm »

Quiero leer un archivo xml donde se encuentran varias pruebas, pero siempre obtengo la primera y no sale del bucle. Si hago una iteración bien, pero cuando hago el bucle, no puedo pasar a la siguiente prueba.

Y si uso // pBodys = pRoot-> NextSiblingElement ("Test"); saltA un error en la iteración 2, (https://i.gyazo.com/9a108bf422299b66abfe91127668a63c.png) si no lo uso, permanece en un bucle infinito

(https://i.gyazo.com/133be25514a8a000fce87e2fc7cc52ad.png)

No puedo seguir adelante.  un saludo

    int main()
    {
        XMLDocument doc;
        doc.LoadFile("example.xml");
        XMLElement *pRoot, *pBodys, *pParms, *pParms2, *pProcess, *pApp, *pLineFormat, *pParm, *pParm2, *count;
        pRoot = doc.FirstChildElement("Tests");
        if (pRoot)
        {
            count = pRoot->FirstChildElement("count");
            std::cout << "cont=" << count->Attribute("cont") << std::endl;
            pBodys = pRoot->FirstChildElement("Test");
            //for (int i = 0; i < (int)count->Attribute("cont"); i++) {


            std::cout << "id=" << pBodys->Attribute("id") << std::endl;
            if (pBodys) {
                pParms = pBodys->FirstChildElement("Inputs");
                if (pParms)
                {
                    pParm = pParms->FirstChildElement("Input");
                    while (pParm) {

                        std::cout << "port=" << pParm->Attribute("port") << " ";
                        std::cout << "value=" << pParm->Attribute("value") << std::endl;


                        pParm = pParm->NextSiblingElement("Input");
                    }
                }
                pParms2 = pBodys->FirstChildElement("Outputs");
                if (pParms2)
                {
                    pParm2 = pParms2->FirstChildElement("Output");
                    while (pParm2) {

                        std::cout << "port=" << pParm2->Attribute("port") << " ";
                        std::cout << "value=" << pParm2->Attribute("value") << std::endl;


                        pParm2 = pParm2->NextSiblingElement("Output");
                    }
                }



            }

            //pBodys = pRoot->NextSiblingElement("Test");
        //}
    }

    return 0;
}

DOC example.xml
<Tests>
    <count cont="2"></count>
    <Test id="test0">
        <Inputs>
            <Input port="A" value="1" />
            <Input port="B" value="4.56" />
            <Input port="C" value="7" />       
        </Inputs>
        <Outputs>
            <Output port="D" value="10" />     
        </Outputs>
    </Test>

    <Test id="test1">
        <Inputs>
            <Input port="K" value="3" />
            <Input port="L" value="9.56" />
        </Inputs>
        <Outputs>
            <Output port="P" value="6" />       
        </Outputs>
    </Test>
</Tests>


En línea

EdePC
Moderador Global
***
Conectado Conectado

Mensajes: 2.067



Ver Perfil
Re: tinyXML c++
« Respuesta #1 en: 1 Febrero 2019, 00:21 am »

Saludos,

- Si te fijas lo has estado haciendo bien, Sibling es Hermano o Campañero, pRoot no tiene ningún hermano o compañero, esto lo tienes que hacer sobre pBodys tal como lo vienes haciendo con pParm = pParms->FirstChildElement("Input");

- Usa: pBodys = pBodys->NextSiblingElement("Test");

- También corrige: (int)count->Attribute("cont") en tu FOR, esto devuelve un Puntero y lo que conviertes a INT es el Puntero, no el valor. Mejor usa: count->IntAttribute("cont") en su lugar:

Código
  1. #include <iostream>
  2. #include "tinyxml2.cpp"
  3. #include "tinyxml2.h"
  4.  
  5. using namespace std;
  6. using namespace tinyxml2;
  7.  
  8. int main() {
  9.  XMLDocument doc;
  10.  doc.LoadFile("example.xml");
  11.  XMLElement *pRoot, *pBodys, *pParms, *pParms2, *pProcess, *pApp, *pLineFormat, *pParm, *pParm2, *count;
  12.  pRoot = doc.FirstChildElement("Tests");
  13.  if (pRoot) {
  14.    count = pRoot->FirstChildElement("count");
  15.    cout << "cont = " << count->Attribute("cont") << endl;
  16.    pBodys = pRoot->FirstChildElement("Test");
  17.  
  18.    for (int i = 0; i < count->IntAttribute("cont"); i++) {
  19.      cout << "id = " << pBodys->Attribute("id") << endl;
  20.      if (pBodys) {
  21.        pParms = pBodys->FirstChildElement("Inputs");
  22.        if (pParms) {
  23.          pParm = pParms->FirstChildElement("Input");
  24.          while (pParm) {
  25.            cout << "port = " << pParm->Attribute("port") << " ";
  26.            cout << "value = " << pParm->Attribute("value") << endl;
  27.            pParm = pParm->NextSiblingElement("Input");
  28.          }
  29.        }
  30.        pParms2 = pBodys->FirstChildElement("Outputs");
  31.        if (pParms2) {
  32.          pParm2 = pParms2->FirstChildElement("Output");
  33.          while (pParm2) {
  34.            cout << "port = " << pParm2->Attribute("port") << " ";
  35.            cout << "value = " << pParm2->Attribute("value") << endl;
  36.            pParm2 = pParm2->NextSiblingElement("Output");
  37.          }
  38.        }
  39.      }
  40.      pBodys = pBodys->NextSiblingElement("Test");
  41.    }
  42.  }
  43.  
  44.  return 0;
  45. }

Código
  1. <Tests>
  2.  <count cont="2"></count>
  3.  <Test id="test0">
  4.    <Inputs>
  5.      <Input port="A" value="1" />
  6.      <Input port="B" value="4.56" />
  7.      <Input port="C" value="7" />        
  8.    </Inputs>
  9.    <Outputs>
  10.      <Output port="D" value="10" />      
  11.    </Outputs>
  12.  </Test>
  13.  <Test id="test1">
  14.    <Inputs>
  15.      <Input port="K" value="3" />
  16.      <Input port="L" value="9.56" />
  17.    </Inputs>
  18.    <Outputs>
  19.      <Output port="P" value="6" />      
  20.    </Outputs>
  21.  </Test>
  22. </Tests>

Código
  1. C:\Users\EdSon\Desktop>g++ xmlreader.cpp -o xmlreader.exe && xmlreader.exe
  2. cont = 2
  3. id = test0
  4. port = A value = 1
  5. port = B value = 4.56
  6. port = C value = 7
  7. port = D value = 10
  8. id = test1
  9. port = K value = 3
  10. port = L value = 9.56
  11. port = P value = 6
  12.  
  13. C:\Users\EdSon\Desktop>

- Documentación TinyXML-2: http://leethomason.github.io/tinyxml2/classtinyxml2_1_1_x_m_l_element.html


En línea

statham

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: tinyXML c++
« Respuesta #2 en: 1 Febrero 2019, 11:27 am »

Saludos,

- Si te fijas lo has estado haciendo bien, Sibling es Hermano o Campañero, pRoot no tiene ningún hermano o compañero, esto lo tienes que hacer sobre pBodys tal como lo vienes haciendo con pParm = pParms->FirstChildElement("Input");

- Usa: pBodys = pBodys->NextSiblingElement("Test");

- También corrige: (int)count->Attribute("cont") en tu FOR, esto devuelve un Puntero y lo que conviertes a INT es el Puntero, no el valor. Mejor usa: count->IntAttribute("cont") en su lugar:

Código
  1. #include <iostream>
  2. #include "tinyxml2.cpp"
  3. #include "tinyxml2.h"
  4.  
  5. using namespace std;
  6. using namespace tinyxml2;
  7.  
  8. int main() {
  9.  XMLDocument doc;
  10.  doc.LoadFile("example.xml");
  11.  XMLElement *pRoot, *pBodys, *pParms, *pParms2, *pProcess, *pApp, *pLineFormat, *pParm, *pParm2, *count;
  12.  pRoot = doc.FirstChildElement("Tests");
  13.  if (pRoot) {
  14.    count = pRoot->FirstChildElement("count");
  15.    cout << "cont = " << count->Attribute("cont") << endl;
  16.    pBodys = pRoot->FirstChildElement("Test");
  17.  
  18.    for (int i = 0; i < count->IntAttribute("cont"); i++) {
  19.      cout << "id = " << pBodys->Attribute("id") << endl;
  20.      if (pBodys) {
  21.        pParms = pBodys->FirstChildElement("Inputs");
  22.        if (pParms) {
  23.          pParm = pParms->FirstChildElement("Input");
  24.          while (pParm) {
  25.            cout << "port = " << pParm->Attribute("port") << " ";
  26.            cout << "value = " << pParm->Attribute("value") << endl;
  27.            pParm = pParm->NextSiblingElement("Input");
  28.          }
  29.        }
  30.        pParms2 = pBodys->FirstChildElement("Outputs");
  31.        if (pParms2) {
  32.          pParm2 = pParms2->FirstChildElement("Output");
  33.          while (pParm2) {
  34.            cout << "port = " << pParm2->Attribute("port") << " ";
  35.            cout << "value = " << pParm2->Attribute("value") << endl;
  36.            pParm2 = pParm2->NextSiblingElement("Output");
  37.          }
  38.        }
  39.      }
  40.      pBodys = pBodys->NextSiblingElement("Test");
  41.    }
  42.  }
  43.  
  44.  return 0;
  45. }

Código
  1. <Tests>
  2.  <count cont="2"></count>
  3.  <Test id="test0">
  4.    <Inputs>
  5.      <Input port="A" value="1" />
  6.      <Input port="B" value="4.56" />
  7.      <Input port="C" value="7" />        
  8.    </Inputs>
  9.    <Outputs>
  10.      <Output port="D" value="10" />      
  11.    </Outputs>
  12.  </Test>
  13.  <Test id="test1">
  14.    <Inputs>
  15.      <Input port="K" value="3" />
  16.      <Input port="L" value="9.56" />
  17.    </Inputs>
  18.    <Outputs>
  19.      <Output port="P" value="6" />      
  20.    </Outputs>
  21.  </Test>
  22. </Tests>

Código
  1. C:\Users\EdSon\Desktop>g++ xmlreader.cpp -o xmlreader.exe && xmlreader.exe
  2. cont = 2
  3. id = test0
  4. port = A value = 1
  5. port = B value = 4.56
  6. port = C value = 7
  7. port = D value = 10
  8. id = test1
  9. port = K value = 3
  10. port = L value = 9.56
  11. port = P value = 6
  12.  
  13. C:\Users\EdSon\Desktop>

- Documentación TinyXML-2: http://leethomason.github.io/tinyxml2/classtinyxml2_1_1_x_m_l_element.html

muchisimas gracias me sirivio!!
Un saludo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines