with studio httptransportse example desde consumir android soap ksoap2

studio - ksoap2-android



Recibir y procesar un Dictionary<string, List<string>> from Soap using KSoap2 (2)

Estoy trabajando en una aplicación de Android que llama a una función de jabón y devuelve un Diction<string, List<string>> .

La respuesta es similar a la siguiente:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <retrieveDatabasesResponse xmlns="http://tempuri.org/"> <retrieveDatabasesResult xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>information_schema</a:Key> <a:Value> <a:string>CHARACTER_SETS</a:string> <a:string>COLLATIONS</a:string> <a:string>COLLATION_CHARACTER_SET_APPLICABILITY</a:string> <a:string>COLUMNS</a:string> <a:string>COLUMN_PRIVILEGES</a:string> <a:string>ENGINES</a:string> <a:string>EVENTS</a:string> <a:string>FILES</a:string> <a:string>GLOBAL_STATUS</a:string> <a:string>GLOBAL_VARIABLES</a:string> <a:string>KEY_COLUMN_USAGE</a:string> <a:string>PARAMETERS</a:string> <a:string>PARTITIONS</a:string> <a:string>PLUGINS</a:string> <a:string>PROCESSLIST</a:string> <a:string>PROFILING</a:string> <a:string>REFERENTIAL_CONSTRAINTS</a:string> <a:string>ROUTINES</a:string> <a:string>SCHEMATA</a:string> <a:string>SCHEMA_PRIVILEGES</a:string> <a:string>SESSION_STATUS</a:string> <a:string>SESSION_VARIABLES</a:string> <a:string>STATISTICS</a:string> <a:string>TABLES</a:string> <a:string>TABLESPACES</a:string> <a:string>TABLE_CONSTRAINTS</a:string> <a:string>TABLE_PRIVILEGES</a:string> <a:string>TRIGGERS</a:string> <a:string>USER_PRIVILEGES</a:string> <a:string>VIEWS</a:string> <a:string>INNODB_BUFFER_PAGE</a:string> <a:string>INNODB_TRX</a:string> <a:string>INNODB_BUFFER_POOL_STATS</a:string> <a:string>INNODB_LOCK_WAITS</a:string> <a:string>INNODB_CMPMEM</a:string> <a:string>INNODB_CMP</a:string> <a:string>INNODB_LOCKS</a:string> <a:string>INNODB_CMPMEM_RESET</a:string> <a:string>INNODB_CMP_RESET</a:string> <a:string>INNODB_BUFFER_PAGE_LRU</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>boardies_password_manager</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>categories</a:string> <a:string>passwords</a:string> <a:string>settings</a:string> <a:string>users</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>bugs</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>comments</a:string> <a:string>logfile_history</a:string> <a:string>platforms</a:string> <a:string>privileges</a:string> <a:string>reports</a:string> <a:string>requested_features</a:string> <a:string>settings</a:string> <a:string>short_bulletins</a:string> <a:string>software</a:string> <a:string>users</a:string> <a:string>versions</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>bugs_demo</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>comments</a:string> <a:string>logfile_history</a:string> <a:string>platforms</a:string> <a:string>privileges</a:string> <a:string>reports</a:string> <a:string>requested_features</a:string> <a:string>settings</a:string> <a:string>software</a:string> <a:string>users</a:string> <a:string>versions</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>bugs_old</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>alarms_archive</a:string> <a:string>comments</a:string> <a:string>discussions</a:string> <a:string>message_content</a:string> <a:string>message_details</a:string> <a:string>platforms</a:string> <a:string>reports</a:string> <a:string>settings</a:string> <a:string>software</a:string> <a:string>users</a:string> <a:string>versions</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>critimon</a:Key> <a:Value> <a:string>administrators</a:string> <a:string>alarms</a:string> <a:string>android_devices</a:string> <a:string>app_using_api_version</a:string> <a:string>available_sdks</a:string> <a:string>config_groups</a:string> <a:string>config_items</a:string> <a:string>config_values</a:string> <a:string>crash_details</a:string> <a:string>customer_queries</a:string> <a:string>development_devices</a:string> <a:string>generated_monthly_reports</a:string> <a:string>registered_apps</a:string> <a:string>sdk_versions</a:string> <a:string>user_config_groups</a:string> <a:string>user_config_items_18</a:string> <a:string>user_config_values</a:string> <a:string>users</a:string> <a:string>windows_devices</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>email</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>alarms_archive</a:string> <a:string>attachments</a:string> <a:string>config_groups</a:string> <a:string>config_items</a:string> <a:string>config_values</a:string> <a:string>queue</a:string> <a:string>smtp_auth_users</a:string> <a:string>smtp_debug_details</a:string> <a:string>smtp_debug_record</a:string> <a:string>users</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>email_something</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>attachments</a:string> <a:string>authenticated_users</a:string> <a:string>auto_replies</a:string> <a:string>blacklist</a:string> <a:string>emailqueue</a:string> <a:string>logfile_history</a:string> <a:string>settings</a:string> <a:string>smtp_debug_details</a:string> <a:string>smtp_debug_record</a:string> <a:string>users</a:string> <a:string>whitelist</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>email_test</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>attachments</a:string> <a:string>authenticated_users</a:string> <a:string>auto_replies</a:string> <a:string>blacklist</a:string> <a:string>emailqueue</a:string> <a:string>logfile_history</a:string> <a:string>settings</a:string> <a:string>smtp_debug_details</a:string> <a:string>smtp_debug_record</a:string> <a:string>users</a:string> <a:string>whitelist</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>email_user</a:Key> <a:Value> <a:string>alarms</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>emailserver</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>attachments</a:string> <a:string>authenticated_users</a:string> <a:string>auto_replies</a:string> <a:string>blacklist</a:string> <a:string>emailqueue</a:string> <a:string>logfile_history</a:string> <a:string>settings</a:string> <a:string>smtp_debug_details</a:string> <a:string>smtp_debug_record</a:string> <a:string>users</a:string> <a:string>whitelist</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>mysql</a:Key> <a:Value> <a:string>columns_priv</a:string> <a:string>db</a:string> <a:string>event</a:string> <a:string>func</a:string> <a:string>general_log</a:string> <a:string>help_category</a:string> <a:string>help_keyword</a:string> <a:string>help_relation</a:string> <a:string>help_topic</a:string> <a:string>host</a:string> <a:string>ndb_binlog_index</a:string> <a:string>plugin</a:string> <a:string>proc</a:string> <a:string>procs_priv</a:string> <a:string>proxies_priv</a:string> <a:string>servers</a:string> <a:string>slow_log</a:string> <a:string>tables_priv</a:string> <a:string>time_zone</a:string> <a:string>time_zone_leap_second</a:string> <a:string>time_zone_name</a:string> <a:string>time_zone_transition</a:string> <a:string>time_zone_transition_type</a:string> <a:string>user</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>mysql_server_manager</a:Key> <a:Value> <a:string>alarms</a:string> <a:string>config_groups</a:string> <a:string>config_items</a:string> <a:string>config_values</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>performance_schema</a:Key> <a:Value> <a:string>cond_instances</a:string> <a:string>events_waits_current</a:string> <a:string>events_waits_history</a:string> <a:string>events_waits_history_long</a:string> <a:string>events_waits_summary_by_instance</a:string> <a:string>events_waits_summary_by_thread_by_event_name</a:string> <a:string>events_waits_summary_global_by_event_name</a:string> <a:string>file_instances</a:string> <a:string>file_summary_by_event_name</a:string> <a:string>file_summary_by_instance</a:string> <a:string>mutex_instances</a:string> <a:string>performance_timers</a:string> <a:string>rwlock_instances</a:string> <a:string>setup_consumers</a:string> <a:string>setup_instruments</a:string> <a:string>setup_timers</a:string> <a:string>threads</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>software_audit_dev</a:Key> <a:Value> <a:string>fault_notes</a:string> <a:string>faults</a:string> <a:string>notes</a:string> <a:string>software</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:KeyValueOfstringArrayOfstringty7Ep6D1> <a:Key>test</a:Key> <a:Value> <a:string>fault_notes</a:string> <a:string>file_history</a:string> <a:string>my_table</a:string> <a:string>stored_connections</a:string> </a:Value> </a:KeyValueOfstringArrayOfstringty7Ep6D1> </retrieveDatabasesResult> </retrieveDatabasesResponse> </s:Body> </s:Envelope>

Estoy tratando de obtener el conteo de los elemenets dentro del mismo para que pueda recorrer la lista, pero lo que intento no parece funcionar.

A continuación está el código que estoy usando

private void processRetrievedDatabase(SoapObject soapResult) { int i = 0; int j = 0; SoapObject rootArray = ((SoapObject)soapResult.getProperty(0)); SoapObject dbArray = ((SoapObject)rootArray.getProperty(0)); int dbCount = dbArray.getPropertyCount(); ArrayList<String> databases = new ArrayList<String>(); while (i < dbCount) { if (i % 2 == 0) { databases.add(dbArray.getPropertyAsString(i)); Log.d(TAG, dbArray.getPropertyAsString(i)); } else { SoapObject tablesArray = ((SoapObject)dbArray.getProperty(i)); int tableCount = tablesArray.getPropertyCount(); while (j < tableCount) { Log.d(TAG, tablesArray.getPropertyAsString(j)); j++; } } i++; }

Debajo está lo que obtengo en el logcat

12-04 19:52:49.480: D/Soap Manager(6204): anyType{Key=information_schema; Value=anyType{string=CHARACTER_SETS; string=COLLATIONS; string=COLLATION_CHARACTER_SET_APPLICABILITY; string=COLUMNS; string=COLUMN_PRIVILEGES; string=ENGINES; string=EVENTS; string=FILES; string=GLOBAL_STATUS; string=GLOBAL_VARIABLES; string=KEY_COLUMN_USAGE; string=PARAMETERS; string=PARTITIONS; string=PLUGINS; string=PROCESSLIST; string=PROFILING; string=REFERENTIAL_CONSTRAINTS; string=ROUTINES; string=SCHEMATA; string=SCHEMA_PRIVILEGES; string=SESSION_STATUS; string=SESSION_VARIABLES; string=STATISTICS; string=TABLES; string=TABLESPACES; string=TABLE_CONSTRAINTS; string=TABLE_PRIVILEGES; string=TRIGGERS; string=USER_PRIVILEGES; string=VIEWS; string=INNODB_BUFFER_PAGE; string=INNODB_TRX; string=INNODB_BUFFER_POOL_STATS; string=INNODB_LOCK_WAITS; string=INNODB_CMPMEM; string=INNODB_CMP; string=INNODB_LOCKS; string=INNODB_CMPMEM_RESET; string=INNODB_CMP_RESET; string=INNODB_BUFFER_PAGE_LRU; }; } 12-04 19:53:01.896: D/Soap Manager(6204): anyType{Key=information_schema; Value=anyType{string=CHARACTER_SETS; string=COLLATIONS; string=COLLATION_CHARACTER_SET_APPLICABILITY; string=COLUMNS; string=COLUMN_PRIVILEGES; string=ENGINES; string=EVENTS; string=FILES; string=GLOBAL_STATUS; string=GLOBAL_VARIABLES; string=KEY_COLUMN_USAGE; string=PARAMETERS; string=PARTITIONS; string=PLUGINS; string=PROCESSLIST; string=PROFILING; string=REFERENTIAL_CONSTRAINTS; string=ROUTINES; string=SCHEMATA; string=SCHEMA_PRIVILEGES; string=SESSION_STATUS; string=SESSION_VARIABLES; string=STATISTICS; string=TABLES; string=TABLESPACES; string=TABLE_CONSTRAINTS; string=TABLE_PRIVILEGES; string=TRIGGERS; string=USER_PRIVILEGES; string=VIEWS; string=INNODB_BUFFER_PAGE; string=INNODB_TRX; string=INNODB_BUFFER_POOL_STATS; string=INNODB_LOCK_WAITS; string=INNODB_CMPMEM; string=INNODB_CMP; string=INNODB_LOCKS; string=INNODB_CMPMEM_RESET; string=INNODB_CMP_RESET; string=INNODB_BUFFER_PAGE_LRU; }; }

Lo tengo casi allí pero debería estar imprimiendo la base de datos seguida de todas las tablas dentro de log cat y repetir, pero por alguna razón solo imprime la primera base de datos y sus tablas.

Entonces en mi ejemplo anterior, debería imprimir

information_schema CHARACTER_SETS COLLATIONS COLLATION_CHARACTER_SET_APPLICABILITY etc etc boardies_password_manager alarms categories passwords etc etc

Pero solo estoy obteniendo information_schema y sus tablas, no el resto de las bases de datos

Gracias por cualquier ayuda que usted nos pueda proporcionar.


Parece que no está claro cómo se analizan los SoapObjects. No estoy seguro de que necesite un módulo. Aparentemente, supongo que todas las propiedades impares serán claves, mientras que todas las propiedades pares serán una lista de valores. No estoy seguro de que sea la mejor manera de hacerlo

Primero, podría tratar de imprimir el valor de dbCount y tableCount. Son ellos lo que esperas que sean. Entonces deberías cambiar

Log.d(TAG, dbArray.getPropertyAsString(i));

y

Log.d(TAG, tablesArray.getPropertyAsString(j));

para establecer una etiqueta diferente para que sepa cuál está imprimiendo.

Esto te ayudará a encontrar dónde el código no está haciendo exactamente lo que quieres que haga, y tal vez regreses aquí con los resultados para que podamos tratar de encontrar algunas ideas más.

Buena suerte


si entiendo correctamente, solo imprime la primera base de datos porque la variable j no se restablece a 0 antes de iniciar el ciclo para la siguiente tabla. Entonces, el bloque else debería verse así:

else { SoapObject tablesArray = ((SoapObject)dbArray.getProperty(i)); int tableCount = tablesArray.getPropertyCount(); // j should reset to 0 j = 0; while (j < tableCount) { Log.d(TAG, tablesArray.getPropertyAsString(j)); j++; } }

O puede querer un ciclo for como este (me gusta de esta manera porque es más fácil y más claro que cuando):

private void processRetrievedDatabase(SoapObject soapResult) { SoapObject rootArray = ((SoapObject)soapResult.getProperty(0)); SoapObject dbArray = ((SoapObject)rootArray.getProperty(0)); int dbCount = dbArray.getPropertyCount(); ArrayList<String> databases = new ArrayList<String>(); for(int i = 0; i < dbCount; i++){ if (i % 2 == 0) { databases.add(dbArray.getPropertyAsString(i)); Log.d(TAG, dbArray.getPropertyAsString(i)); } else { SoapObject tablesArray = ((SoapObject)dbArray.getProperty(i)); int tableCount = tablesArray.getPropertyCount(); for(int j = 0; j < tableCount; j++){ Log.d(TAG, tablesArray.getPropertyAsString(j)); } } } }