Monday, November 08, 2010 at 12:05 AM.

system.verbs.builtins.soap.decode.main

on main (adrmsg, adrelement, flEnforceSimpleTypes=true) {
	<<Changes:
		<<03/26/01; 11:51:43 AM by JES
			<<Added decoding of Void elements.
		<<04/05/01; 9:57:05 PM by JES
			<<Get types as determined by the schema namespace URI specified by the message. New optional parameter, flEnforceSimpleTypes, specifies whether to fault on elements whose type is not specified. This is passed to soap.decode.struct and soap.decode.array.
		<<05/04/01; 7:20:53 PM by JES
			<<If an element has no children, and also has cdata, it's not an empty struct -- it's a simple-type. Decode it as such.
	soap.xmlutils.pushScope (adrmsg, adrelement);
	local (value, href);
	try {
		adrelement = soap.xmlutils.resolveHref (adrmsg, adrelement);
		if adrelement == false { //decode void elements
			local (voidTable); new (tableType, @voidTable);
			return (voidTable)};
		if soap.xmlutils.hasChildren (adrelement) { //compound type: struct or array?
			local (arraytype = soap.xmlutils.getAttributeValue (adrelement, soap.xmlutils.setQualifiedName (adrmsg, "arrayType", soap.constants.nsEncodingURI)));
			if arraytype {
				value = soap.decode.array (adrmsg, adrelement, arraytype, flEnforceSimpleTypes)}
			else { //assume it's a struct
				value = soap.decode.struct (adrmsg, adrelement, flEnforceSimpleTypes)}}
		else { //simple type
			local (type, adrSchemaVersion, schemaURI = soap.constants.nsSchemaURI);
			for adrSchemaVersion in @soap.constants.schemaVersions { //find the XML schema URI
				schemaURI = adrSchemaVersion^.nsURI;
				type = soap.xmlutils.getAttributeValue (adrelement, soap.xmlutils.setQualifiedName (adrmsg, "type", schemaURI));
				if type {
					break}};
			if type {
				value = soap.decode.simpleType (adrmsg, adrelement, type)}
			else { //maybe it's a nil value, empty struct or empty array?
				if flEnforceSimpleTypes {
					local (nilattrib = soap.xmlutils.getAttributeValue (adrelement, soap.xmlutils.setQualifiedName (adrmsg, "null", schemaURI)));
					if nilattrib == "1" {
						value = nil}
					else { //11/15/00 JES: handle empty arrays and structs
						local (arraytype = soap.xmlutils.getAttributeValue (adrelement, soap.xmlutils.setQualifiedName (adrmsg, "arrayType", soap.constants.nsEncodingURI)));
						if arrayType {
							value = {}}
						else { //empty struct, nil value or non-typed value
							if not soap.xmlutils.getFirstChildElement (adrelement) { // empty struct or non-typed scalar
								local (cdata = soap.xmlutils.getCharacterData (adrelement));
								if cdata == "" { //empty struct
									local (t); new (tableType, @t);
									value = t}
								else {
									value = soap.decode.unknownSimpleType (cdata)}}
							else {
								scripterror ("Can't decode \"" + soap.xmlutils.getElementName (adrelement) + "\" element because no type was specified.")}}}}
				else { //try to coerce cdata to some value
					value = soap.decode.unknownSimpleType (soap.xmlutils.getCharacterData (adrelement))}}}}
	else {
		soap.xmlutils.popScope (adrmsg);
		scripterror (tryerror)};
	soap.xmlutils.popScope (adrmsg);
	return (value)}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.