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:43]
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 ==== 
  
  
  
-==== Recorrer atributos de un elemento ==== + 
-Para recoger el valor de un atributo 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.+ 
 + 
 +==== 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> <code cpp>
 TiXmlAttribute* pAttrib=pElement->​FirstAttribute();​ TiXmlAttribute* pAttrib=pElement->​FirstAttribute();​
Línea 82: 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]].
fw/txml.1211744608.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)