Herramientas de usuario

Herramientas del sitio


fw:txml

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:txml [2008/05/25 19:36]
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 70: Línea 91:
  
 ===== Lectura ===== ===== Lectura =====
 +
 +
 +
 +
 +
 +
  
 ==== Recorrer un archivo ==== ==== 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 ====
 +=== Recorrer los atributos de un elemento ===
 +Sólo debemos coger el primer atributo de un elemento con ''​FirstAttribute''​ e ir recorriendolos utilizando el ''​Next''​ que te devuelve el siguiente o si no NULL.
 +<code cpp>
 +TiXmlAttribute* pAttrib=pElement->​FirstAttribute();​
 +while (pAttrib) {
 +  pAttrib=pAttrib->​Next();​
 +}
 +</​code>​
 +=== Recoger el nombre ===
 +Nada, llamas al método ''​Name''​ y ahí lo tienes, en un stringcito tó bonito.
 +=== 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. \\
 +Para recoger el valor de un atributo en formato numérico tenemos que recoger su objeto ''​TiXmlAttribute''​ correspondiente y a este le llamaríamos a los métodos ''​QueryIntValue(int*)''​ o ''​QueryDoubleValue(double*)'';​ lo que hacen estos métodos es recoger el valor e introducirlo en la variable (int o double) pasada por referencia, pero como no sabemos qué tipo es este método devolverá ''​TIXML_SUCCESS''​ si la asignación ha sido correcta.
 +<code cpp>
 +TiXmlAttribute* pAttrib=pElement->​FirstAttribute();​
 +if (pAttrib->​QueryIntValue(&​ival)==TIXML_SUCCESS) ​   printf( "valor %d", ival);
 +if (pAttrib->​QueryDoubleValue(&​dval)==TIXML_SUCCESS) printf( "valor %1.1f",​ dval);
 +</​code>​
 +
  
-==== Recorrer atributos de un elemento ==== 
 ===== 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]].
fw/txml.1211744169.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)