Wednesday, December 27, 2006

Serialize JavaScript objects to XML (for use with Ajax)

The following 3 functions can be added to any JavaScript library to serialize objects to XML for use with Ajax.

--- serialize.js ---

Array.prototype.toXml = function(t){
var s = new Array(), i, l = this.length, v;
var t2 = (t.charAt(t.length-1)=='s')?t.substring(0,t.length-1):t;

for(i=0;i<l;i++){
v = this[i];
switch (typeof v) {
case 'undefined':
case 'function':
case 'unknown':break;
case 'object':if(v!=null){s.push(v.toXml(t2));}break;
case 'string':v = v.toXml();
default:s.push('<'+t2+'>'+v+'');
}
}
if(s.length>1)return '<'+t+'>'+s.join('')+'';
return s;
};

Object.prototype.toXml = function(t){
var sa = new Array(''), se = new Array('');
if(!t) t=this._tagName||'object';

for(var i in this){
if (this.hasOwnProperty(i) && i.charAt(0)!='_') {
var v = this[i];
switch (typeof v) {
case 'undefined':
case 'function':
case 'unknown':break;
case 'object':if(v!=null){se.push(v.toXml(i));}break;
case 'string':v = v.toXml();
default: sa.push(' '+i+'="'+v+'"');
}
}
}
var s = se.join('');
return '<'+t+sa.join('')+((s!='')?'>'+s+'':'/>');
};

String.prototype.toXml = function(){
return this.replace('&','&amp;').
replace('<','&lt;').replace('>','&gt;').
replace('\'','&apos;').replace('"','&quot;');
};


Sample Usage

<script language="javascript" src="serialize.js"></script>
<script language="javascript">

function Car(make,model,color){
this.make = make;
this.model = model;
this.color = color;
}

var cars = new Array();
cars.push(new Car('BMW','545i','Silver'));
cars.push(new Car('Toyota','Corrola','Red'));
cars.push(new Car('Honda','Accord','Black'));

//serialize to xml
alert(cars.toXml());
</script>


Note:
1. Private properties are prefixed with an underscore
2. You can add a default TagName for an object using the this._tagName property. For example in the Cars object above, you can add:
this._tagName = 'car';
...

6 comments:

pitoti said...

Looks good.
But You forget close tags for a valid xml

Thanks....is useful for me.

Mirek Rusin said...

http://svn.mirekrusin.com/pub/javascript/to_xml/trunk looks much nicer!

katty said...

JavaScript is a good program and very easy to use. I don´t like a complex program. I prefer javascript because i consider it like a device very eficient and it have a good quality.
I always looking for the quality that is why i prefer to buy viagra because i always have a great result in my sexual life.

brinkka said...

Erectile Dysfunction FAQ's

Impotence, or penile erectile dysfunction, in men is not as rare as one would think it is.
In fact, one out of ten men around the world is affected by this condition. It is not exclusive to old men either. Impotence is caused not just by physical factors,
but mental factors as well.
Exercising on a regular basis and eating healthy food will increase your ability to sustain prolonged physical effort and we all know that sex is effort.
Smoking, frequently drinking large quantities of alcohol, taking recreational drugs and lack of exercising will sap your stamina and also slow down the flow of blood.
Penis exercises can be used for maintaining fitness, preventing or controlling premature ejaculation and increasing the length and girth of the penis.
by penis enlargement pills you can overcome these problems and not only that you can also enlarge, extend also to strengthen your penis and premature ejaculation will not exist anymore for you.
visit http://www.factspenisenlargement.com for more info.

Baby Monitors said...

This is a great script, thanks. For all your home security needs go to http://www.securehomeadvice.com

scrat said...

here is a better version, base on the code above:

Array.prototype.toXml = function (t) {
var s = new Array(), i, v;
if (typeof t === 'undefined' || t === null) {
t = this._tagName || 'array';
}

for (i = 0; i < this.length; i++) {
v = this[i];
switch (typeof v) {
case 'undefined':
case 'function':
case 'unknown':
{
break;
}
case 'object':
{
if (v != null) {
s.push(v.toXml(t));
}
break;
}
case 'string':
{
v = v.toXml();
}
default:
{
s.push('<' + t + '>' + v + '');
}
}
}
var result = '';
if (s.length > 0) {
result = s.join('');
}
return result;
};

Object.prototype.toXml = function (t) {
var sa = new Array();
var se = new Array();
if(!t) t=this._tagName||'object';
if (typeof t === 'undefined' || t === null) {
t = this._tagName || 'object';
}

for (var i in this) {
if (this.hasOwnProperty(i) && i.charAt(0) != '_') {
var v = this[i];
switch (typeof v) {
case 'undefined':
case 'function':
case 'unknown':
{
break;
}
case 'object':
{
if (v != null) {
se.push(v.toXml(i));
}
break;
}
case 'string':
{
v = v.toXml();
}
default:
{
if (i === '$text')
{
if (v != null) {
se.push(v.toXml(i));
}
}
else if (i.charAt(0) === "@")
{
sa.push(i.slice(1) + '="' + v + '"');
}
else
{
sa.push(i + '="' + v + '"');
}
}
}
}
}

var result = '<' + t;
if (sa.length > 0)
{
result += ' ' + sa.join(' ');
}
if (se.length > 0)
{
result += '>' + se.join('') + '';
}
else
{
result += '/>';
}

return result;
};

String.prototype.toXml = function () {
return this.replace('&','&').replace('<','<').replace('>','>').replace('\'','&apos;').replace('"','"');
};