Ignoring blank spaces in SOAP
Fernando Herrera <[email protected]> Thu, 1 Jul 2004 21:36:28 +0200
| Newsgroups | gmane.comp.gnome.ximian.soup |
|---|---|
| Message-ID | <[email protected]> |
--fUYQa+Pmc3FrFX/N
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
Hi, I was writing test cases for the libsoup XML-RPC stuff and
also did some for SOAP. I realized that for example google SOAP API was
failing because the xml parsing is interpreting blank characters and new
lines as nodes. The most simple solution would be the following patch:
--- libsoup/soup-soap-response.c 18 Feb 2004 15:00:34 -0000 1.12
+++ libsoup/soup-soap-response.c 1 Jul 2004 19:04:04 -0000
@@ -153,6 +153,7 @@
old_doc = response->priv->xmldoc;
/* parse the string */
+ xmlKeepBlanksDefault (0);
response->priv->xmldoc = xmlParseMemory (xmlstr, strlen (xmlstr));
if (!response->priv->xmldoc) {
response->priv->xmldoc = old_doc;
The other option is using xmlIsBlankNode almost everywhere.
I've attached the google api test.
Salu2
--
Fernando Herrera de las Heras
Onírica: análisis, diseño e implantación de soluciones informáticas
http://www.onirica.com
--fUYQa+Pmc3FrFX/N
Content-Type: text/x-csrc; charset=us-ascii
Content-Disposition: attachment; filename="soap-google.c"
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include "libsoup/soup-session-sync.h"
#include "libsoup/soup-soap-message.h"
#include "libsoup/soup-soap-response.h"
void
parse_response (SoupSoapMessage *req)
{
SoupSoapResponse *response;
SoupSoapParameter *result, *item, *tmp;
char *title, *url;
g_print ("Results:\n");
response = soup_soap_message_parse_response (req);
result = soup_soap_response_get_first_parameter_by_name (response, "return");
if (result == NULL) {
g_object_unref (response);
return;
}
result = soup_soap_parameter_get_first_child_by_name (result, "resultElements");
if (result == NULL) {
g_object_unref (response);
return;
}
item = soup_soap_parameter_get_first_child_by_name (result, "item");
while (item != NULL) {
tmp = soup_soap_parameter_get_first_child_by_name (item, "title");
title = soup_soap_parameter_get_string_value (tmp);
tmp = soup_soap_parameter_get_first_child_by_name (item, "URL");
url = soup_soap_parameter_get_string_value (tmp);
g_print ("%s (%s)\n", url, title);
g_free (title);
g_free (url);
item = soup_soap_parameter_get_next_child_by_name (item, "item");
}
g_object_unref (response);
return;
}
int
main (int argc, char **argv)
{
SoupSoapMessage *message;
SoupSession *session;
xmlDocPtr xml;
char *string;
int size;
if (argc != 2) {
g_print ("Usage %s: <google SOAP API key>\n", argv[0]);
return 1;
}
g_type_init ();
g_thread_init (NULL);
message = soup_soap_message_new ("POST", "http://api.google.com/search/beta2",
TRUE, "UTF-8", NULL, NULL);
soup_soap_message_start_envelope (message);
soup_soap_message_start_body (message);
soup_soap_message_start_element (message, "doGoogleSearch", "ns1", "urn:GoogleSearch");
soup_soap_message_start_element (message, "key", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:string");
soup_soap_message_write_string (message, argv[1]);
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "q", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:string");
soup_soap_message_write_string (message, "gnome");
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "start", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:int");
soup_soap_message_write_int (message, 0);
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "maxResults", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:int");
soup_soap_message_write_int (message, 10);
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "filter", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:boolean");
soup_soap_message_write_string (message, "false");
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "restrict", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:string");
soup_soap_message_write_string (message, "");
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "safeSearch", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:boolean");
soup_soap_message_write_string (message, "false");
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "lr", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:string");
soup_soap_message_write_string (message, "");
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "ie", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:string");
soup_soap_message_write_string (message, "latin1");
soup_soap_message_end_element (message);
soup_soap_message_start_element (message, "oe", NULL, NULL);
soup_soap_message_set_element_type (message, "xsd:string");
soup_soap_message_write_string (message, "latin1");
soup_soap_message_end_element (message);
soup_soap_message_end_element (message);
soup_soap_message_end_body (message);
soup_soap_message_end_envelope (message);
soup_soap_message_persist (message);
session = soup_session_sync_new ();
xml = soup_soap_message_get_xml_doc (message);
xmlDocDumpMemory ((xmlDocPtr) xml, (xmlChar **) &string, &size);
g_print ("Sending:\n%s\n", string);
soup_session_send_message (session, SOUP_MESSAGE (message));
parse_response (message);
g_object_unref (message);
g_object_unref (session);
return 0;
}
--fUYQa+Pmc3FrFX/N--
_______________________________________________
Soup-list maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/soup-list