Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:txml [2008/05/25 19:54] alfred |
fw:txml [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 33: | Línea 33: | ||
| ===== Escritura ===== | ===== Escritura ===== | ||
| + | |||
| Línea 57: | Línea 58: | ||
| <?xml version="1.0" ?> | <?xml version="1.0" ?> | ||
| <Hello>World</Hello> | <Hello>World</Hello> | ||
| + | </code> | ||
| + | Otro ejemplo: | ||
| + | <code cpp> | ||
| + | TiXmlDocument doc; | ||
| + | TiXmlElement* msg; | ||
| + | |||
| + | TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" ); | ||
| + | doc.LinkEndChild( decl ); | ||
| + | |||
| + | TiXmlElement * root = new TiXmlElement( "MyApp" ); | ||
| + | doc.LinkEndChild( root ); | ||
| + | |||
| + | msg = new TiXmlElement( "Welcome" ); | ||
| + | msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" )); | ||
| + | root->LinkEndChild( msg ); | ||
| + | |||
| + | msg = new TiXmlElement( "Farewell" ); | ||
| + | msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" )); | ||
| + | root->LinkEndChild( msg ); | ||
| + | ... | ||
| </code> | </code> | ||
| Línea 71: | Línea 92: | ||
| ===== Lectura ===== | ===== Lectura ===== | ||
| - | ==== Recorrer un archivo ==== | ||
| Línea 77: | Línea 97: | ||
| + | |||
| + | ==== Recorrer un archivo ==== | ||
| + | Una vez recojas el primer elemento del documento obtendrás como tal un ''TiXmlNode'', a partir de este, como ya sabes, la estructura está montada en forma de árbol. Para acceder a sus nodos hijos sólo tendrás que recoger el primero con ''FirstChild'' y recorrer los elementos mediante ''NextSibling'' hasta que este método no devuelva NULL. El método ''Value'' devolvería el nombre del tag. | ||
| + | <code cpp> | ||
| + | int countNodes (TiXmlNode* node) { | ||
| + | if (node == NULL) | ||
| + | return 0; | ||
| + | TiXmlNode* child = node->FirstChild(); | ||
| + | int i = 1; | ||
| + | while(child != NULL) { | ||
| + | i += countNodes(child); | ||
| + | child = child->NextSibling(); | ||
| + | } | ||
| + | return i; | ||
| + | } | ||
| + | |||
| + | int main() { | ||
| + | TiXmlDocument doc( "ex1.xml" ); | ||
| + | if (!doc.LoadFile()) | ||
| + | cout << "Carga incorrecta.\n"; | ||
| + | cout << countNodes(&doc) << "\n"; | ||
| + | system("pause"); | ||
| + | return 0; | ||
| + | } | ||
| + | </code> | ||
| + | Para saber el tipo de elemento que es la clase ''TiXmlNode'' tiene un método que devuelve un integer comparable a las constantes dentro de esa mismaclase: ''TiXmlNode::COMMENT'', ''TiXmlNode::DECLARATION'', ''TiXmlNode::DOCUMENT'', ''TiXmlNode::ELEMENT'', ''TiXmlNode::TEXT'' o ''TiXmlNode::UNKNOW''. \\ \\ | ||
| + | De un nodo también podemos saber el atributo padre utilizando el método ''Parent''. O sacar el valor en texto mediante ''ToText''. \\ \\ | ||
| + | Aún pudiendo recorrerse de forma sencilla, lo mejor es utilizar el ''[[#utilizar_el_tixmlhandle|TiXmlHandle]]''. | ||
| ==== Cómo tratar los atributos ==== | ==== Cómo tratar los atributos ==== | ||
| Línea 87: | Línea 135: | ||
| } | } | ||
| </code> | </code> | ||
| + | === Recoger el nombre === | ||
| + | Nada, llamas al método ''Name'' y ahí lo tienes, en un stringcito tó bonito. | ||
| === Recoger el valor === | === Recoger el valor === | ||
| Recoger un valor como string es muy sencillo, únicamente hemos de llamar al método ''Value'' y este lo devuelve sin problema alguno. \\ | Recoger un valor como string es muy sencillo, únicamente hemos de llamar al método ''Value'' y este lo devuelve sin problema alguno. \\ | ||
| Línea 95: | Línea 145: | ||
| if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( "valor %1.1f", dval); | if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( "valor %1.1f", dval); | ||
| </code> | </code> | ||
| + | |||
| ===== Como... ===== | ===== Como... ===== | ||
| + | ==== Insertar un comentario ==== | ||
| + | Se crea un objeto ''TiXmlComment'' y le añadimos el texto mediante su método ''SetValue''. | ||
| + | <code cpp> | ||
| + | TiXmlComment * comment = new TiXmlComment(); | ||
| + | comment->SetValue(" Settings for MyApp " ); | ||
| + | root->LinkEndChild( comment ); | ||
| + | </code> | ||
| + | |||
| + | |||
| + | ==== Utilizar el TiXmlHandle ==== | ||
| + | Es una forma más sencilla de acceder a los elementos permitiendo acceder directamente a sus hijos. | ||
| + | <code cpp> | ||
| + | TiXmlHandle docHandle( &document ); | ||
| + | TiXmlElement* child2 = docHandle.FirstChild("Document").FirstChild("Element").Child("Child", 1).ToElement(); | ||
| + | </code> | ||
| + | <code cpp> | ||
| + | int i=0; | ||
| + | while () { | ||
| + | TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); | ||
| + | if ( !child ) | ||
| + | break; | ||
| + | i++; | ||
| + | } | ||
| + | </code> | ||
| + | ==== Enlazar una clase a un archivo .xml ==== | ||
| + | Evidentemente puedes hacerlo manualmente, pero la forma más sencilla es utilizando [[http://sourceforge.net/projects/tinybind|TinyBind]]. | ||