XML Parser for JavaScript - xml2array()
xml2array() parses the given XML document and return the data in an associative array.
See Demo.
Useage
XmlHttp.onreadystatechange = function() {
if(XmlHttp.readyState == 4 && XmlHttp.status == 200) {
var arr = xml2array(XmlHttp.responseXml);
// Do what you want with 'arr'
}
});
Just load the XML file using the method you are most comfortable with and then call the xml2array function with the XML object as the argument.
Code
The code is given in the xml2array.js file. It is a bit ugly - but it gets the job done. This file also includes the code for the xjx library and the dump function(Javascript equivalent of PHP's print_r function).
The code is somewhat big(100 lines of code) so I am not putting it in this page - just have a look at the js file for the code. You need just the xml2array() function and the two global variables at top - there are two other functions there - just ignore them.
Problems
There are some problems with the script - but this just the first release so it is to be expected.
I have only tested the script in the following browsers. Please let me know how the script worked in other browser's.
- Firefox 1.5 in Linux
- Firefox 1.5 in Windows
- IE 6 in Windows
- Mozilla in Linux
Another problem is that the scripts runs into trouble when such details like XML version(<?xml version="1.0"?>) or stylesheet information(<?xml-stylesheet type="text/xsl" href="softwares.xsl" ?>) or some other extra infomation like <!DOCTYPE programs SYSTEM "softwares.dtd"> is there in the XML file. I am hopping this will not be much of a problem as this script is aimed for use with Ajax responses in XML format - so we can safely assume that there will not be any 'stylesheet' information in it ;-). If you find any solution for this problem, please let me know - my email is moc.liamg@avynnib
Actionscript
I was hoping that I could get this script to work in Actionscript. I don't 'know' actionscript per se - I know javascript and assume that I could code in Actionscript as they have very similar syntax. Unfortunately, the script fails in Actionscript - some problem with the whitespace Regular Expression. If any of you know actionscript, please take a look at the script and if you could get it working in Flash, drop me a line at moc.liamg@avynnib.
License
This script is released in the BSD license.

Comments
javascript response "undefinded".
//xml2array code
arr = new Object;
and I try to modified to arr = new Array();
is OK.
I want to ask why not define to Object not is array in the codes?
JavaScript "Associative Arrays" Considered Harmful
Javascript Associative Arrays considered harmful
Cheers
well i can run d code without any errors...
how ever if i try to alert(arr)...it says object...
and in some places it says undefined...
plz tell me how do i get the parsed content thts there in the arr!!!
plz reply asap!!!![:)]
<root>
<child>bullying jerk</child>
<child>all-round awesome</child>
</root>
but not as much with
<root>
<child>slightly spoiled, but pretty rad</child>
</root>
Has anyone else had this problem?
I added additional condition for parent compare.
if(xmlDoc.nodeName && xmlDoc.nodeName.charAt(0) != "#") {
if ( (xmlDoc.childNodes.length > 1)
|| ( (xmlDoc.childNodes.length == 1) && (xmlDoc.childNodes[0].childNodes.length > 0) ) ) { //If its a parent
arr = new Object;
parent = xmlDoc.nodeName;
}
}
All the best for you, BinnyVa
if(XmlHttp.readyState == 4 && XmlHttp.status == 200) {
var arr = xml2array(XmlHttp.responseXml);
// Do what you want with 'arr'
}
});
Default behaviour is to place attributes outside, ie. in parents tag and implies that attributes can not be used in the root-tag
In what kind of situations is there an advantage to have attributes placed outside?
2 <contacts>
3 <contact name="Able Baker">
4 <contact name="Careful Dodger">
5 <contact name="Eager Framer" personal="true">
6 </contacts>
But like the previous Anonymous poster I have a problem with accessing attributes (with attribute_inside 0 and/or 1) when I have multiple nodes like this:
<contacts>
<contact name="Able Baker">able@example.com</contact>
<contact name="Careful Dodger">dodger@example.com</contact>
<contact name="Eager Framer" personal="true">framer@example.com</contact>
</contacts>
I can get the first name (Able Baker) with "arr['contacts']['attribute_contact_name']" (attribute_inside = 1) or with "arr['contacts']['contact'][0]['attribute_name']" (attribute_inside = 0), but any other name (ie.: arr['contacts']['contact'][1]['attribute_name']) return "undefined" or an error.
Any idea how to get "Careful Dodger" or "Eager Framer"?
Unfortunately the code is not working with this xml
<Address>
<AddressLine1 title="Address Line 1" type="string" tooltip=""/>
<AddressLine2 title="Address Line 2" type="string" tooltip=""/>
<TownCity title="Town or City" type="string" tooltip=""/>
<County title="County" type="string" tooltip=""/>
<Postcode title="Postcode" type="string" tooltip=""/>
</Address>
The parsing get stop after the parent node 'Address'. can u plz look at this
. the code is not working in the ie
<job>
<name>Example 1</name>
<hours>5</hours>
<programmingCost>120</programmingCost>
<programmingPer>hour</programmingPer>
<processingCost>15</processingCost>
<processingPer>thousand records</processingPer/>
<printingCost>28</printingCost>
<printingPer>thousand impressions</printingPer/>
<insertingCost>30</insertingCost>
<insertingPer>thousand mailpacks</insertingPer/>
<lodgement>50</lodgement>
</job>
<job>
<name>Example 2</name>
<hours>8</hours>
<programmingCost>110</programmingCost>
<programmingPer>hour</programmingPer>
<processingCost>20</processingCost>
<processingPer>ten thousand records</processingPer/>
<printingCost>24</printingCost>
<printingPer>thousand impressions</printingPer/>
<insertingCost>28</insertingCost>
<insertingPer>thousand mailpacks</insertingPer/>
<lodgement>60</lodgement>
</job>
any clue how to fix it? thanks in advance
1) enclose the whole xml in a tag. Something like <xmldata><job>...</job><job>...</job></xmldata>
2) some elements have a /> at the end - remove that.
Say something like this:
var str = "<xml><x1>jhfh</x1><x2>ghdskjgh</x2></xml>";
Please help.
var parser = new DOMParser();
var xmldoc = parser.parseFromString(str,'text/xml');
...do whatever you want to do with xmldoc...
<GeoMediaElementManager>
<numElements value="2" />
<GeoMediaElement>
<mID value="0" />
<mType value="Text" />
<mURL value="Audio0.wav" />
<mDate value="21.9.2008" />
<mUserName value="User 1" />
<mScenario value="Teatro Cervantes" />
<GPSPosition>
<latitude value="0" />
<longitude value="0" />
<altitude value="0" />
</GPSPosition>
</GeoMediaElement>
<GeoMediaElement>
<mID value="1" />
<mType value="Image" />
<mURL value="d:\code\cpp\Projects\GeoMedia\project\vc8\GeoMedia\image1.bmp" />
<mDate value="21.9.2008" />
<mUserName value="User 1" />
<mScenario value="Teatro Cervantes" />
<GPSPosition>
<latitude value="0" />
<longitude value="0" />
<altitude value="0" />
</GPSPosition>
</GeoMediaElement>
</GeoMediaElementManager>
Thanks!
2) some elements have a /> at the end - remove that.
could u add a code example at HTML how to read the xml2array function
Thanks!
I used xml.ignoreWhite = true;
and commentted out
//var not_whitespace = new RegExp(/[^\s]/);
and
//if(not_whitespace.test(value)) {//If its a child
arr = new Object;
arr[xmlDoc.parentNode.nodeName] = value;
//}
I looks like working
I added/modified the line to
var temp_arr = arr[key];
arr[key] = [];
arr[key][0] = new Object;
arr[key][0] = temp_arr;
the output is exactly as before but now I can get lengths of the numeric arrays. (as opposed to it being an associative array)
<xml><contacts><contact email="joe@email.com">Joe</contact><contact email="bob@email.com">Bob</contact></contacts></xml>
with attribute_inside = 1
The following codes:
if(xmlDoc.nodeName && xmlDoc.nodeName.charAt(0) != "#") {
if(xmlDoc.childNodes.length > 1) { //If its a parent
arr = new Object;
parent = xmlDoc.nodeName;
}
shall be changed to:
if(xmlDoc.nodeName && xmlDoc.nodeName.charAt(0) != "#") {
if(xmlDoc.childNodes.length > 1) { //If its a parent
arr = new Object;
parent = xmlDoc.nodeName;
}
else if (xmlDoc.childNodes.length == 1 && xmlDoc.childNodes[0].nodeType != 3){ //TEXT_NODE: 3
arr = new Object;
parent = xmlDoc.nodeName;
}
Consider below example:
<c>
kkk
</c>
The original function cannot parse node "b" correctly. a.b is null....
e.g.,
<aa>
<bb>
<cc>
kkkk
</cc>
</bb>
</aa>
The original function cannot parse node "bb" correctly. aa.bb is null....since bb only has one child node and it is parent node.
XML Parser for JavaScript - xml2array() ki complete file to do
a, strong, em, b, i, code, pre, pandbrallowed. Other tags will be shown as code(< will become <). Urls, Line breaks will be auto-formated.