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));
}
}
}
}