static GNode *xml_build_tree(XMLFile *file, GNode *parent, guint level) { GNode *node = NULL; XMLNode *xmlnode; XMLTag *tag; while (xml_parse_next_tag(file) == 0) { if (file->level < level) break; if (file->level == level) { g_warning("xml_build_tree(): Parse error in %s", file->path); break; } tag = xml_get_current_tag(file); if (!tag) break; xmlnode = xml_node_new(xml_copy_tag(tag), NULL); xmlnode->element = xml_get_element(file); if (!parent) node = g_node_new(xmlnode); else node = g_node_append_data(parent, xmlnode); xml_build_tree(file, node, file->level); if (file->level == 0) break; } return node; }
static void xmlprops_read_props( XmlProperty *props, XMLFile *file ) { GList *attr; gchar *name, *value; gchar *pName; gchar *pValue; while( TRUE ) { pName = g_strdup(""); pValue = g_strdup(""); if (! file->level ) break; xml_parse_next_tag( file ); if( xml_compare_tag( file, XMLS_ELTAG_PROPERTY ) ) { attr = xml_get_current_tag_attr( file ); while( attr ) { name = ( ( XMLAttr * ) attr->data )->name; value = ( ( XMLAttr * ) attr->data )->value; if( strcmp( name, XMLS_ATTAG_NAME ) == 0 ) { g_free(pName); pName = g_strdup( value ); } else if( strcmp( name, XMLS_ATTAG_VALUE ) == 0 ) { g_free(pValue); pValue = g_strdup( value ); } attr = g_list_next( attr ); } xmlprops_save_property( props, pName, pValue ); } g_free(pName); g_free(pValue); } }
/* * Load properties from file. * return: Status code. */ gint xmlprops_load_file( XmlProperty *props ) { XMLFile *file = NULL; cm_return_val_if_fail( props != NULL, -1 ); props->retVal = MGU_NO_FILE; file = xml_open_file( props->path ); if( file == NULL ) { return props->retVal; } props->retVal = MGU_BAD_FORMAT; if( xml_get_dtd( file ) == 0 ) { if( xml_parse_next_tag( file ) == 0 ) { if( xml_compare_tag( file, XMLS_ELTAG_PROP_LIST ) ) { xmlprops_read_props( props, file ); props->retVal = MGU_SUCCESS; } } } xml_close_file( file ); return props->retVal; }