PDA

View Full Version : XML Parsing


bilsalak
04-15-2005, 07:46 AM
Posting this in the spirit of "2 heads are better than one" and hoping to see someone improve upon this. If it helps someone looking for an answer than that's even better..

The idea is to load and parse an xml file with an unknown number of <item> nodes and an unknown number of children to the <item> node which may or may not have any number of attributes. Currently I see 2 problems:

1. You must know the names of the attributes and nodes in the xml file, and reference them by name, this doesnt really allowyou to have an unknown number of cghildren to the <item> node, does it? I have an idea of how to fix this but haven't spent the time yet... it's possible to parse the attribute names and assign them to vars used to reference their values in the array...

2. Adding more than 1 child with the same name inside of an <item> node causes the original values to be overwritten when parsed.. trying to figure the best way to do this... might be cleaner if the solution comes from the server side creation of the xml file and duplicate names are avoided when creating the children of <item>.

//Import our external AS class
import BodyChart;

//Container for our data
BodyChart_arr = new Array();

//Load the XML
BodyChart_xml = new XML();
BodyChart_xml.ignoreWhite = true;
BodyChart_xml.onLoad = function ( success ) {
if ( success ) {
Process = new BodyChart();
var item_xml = BodyChart_xml.firstChild.firstChild;

//loop counter, will be used as an array reference later
var i:Number = 0;

//loop through our xml nodes until they're gone
while ( item_xml != null ) {

// put the data in a package
BodyChart_arr.push( Process.getBodyChartData( item_xml ) );

//testing vars
trace("Array " + i + " contains the following vars " + BodyChart_arr[i].trans_name + " " + BodyChart_arr[i].item_name + " " + BodyChart_arr[i].xray_date + " " + BodyChart_arr[i].xray_short + " " + BodyChart_arr[i].xray_attendee + " " + BodyChart_arr[i].xray + " " + BodyChart_arr[i].surgeries_date + " " + BodyChart_arr[i].surgeries_date + " " + BodyChart_arr[i].surgeries_short + " " + BodyChart_arr[i].surgeries_attendee + " " + BodyChart_arr[i].surgeries + " " + BodyChart_arr[i].diagnosis_date + " " + BodyChart_arr[i].diagnosis_short + " " + BodyChart_arr[i].diagnosis_attendee + " " + BodyChart_arr[i].diagnosis);

//increment our counter
i++;

//move to the next node in line
item_xml = item_xml.nextSibling;

}//end while
} else {
trace("Error loading XML data.");
}//end if
//cleanup after ourselves
delete BodyChart_xml;
}//end function
BodyChart_xml.load( "BodyChartExample.xml" );

stop();


class BodyChart {

function getBodyChartData( item_xml ) {
var BodyChartData = new Object();
var data_xml = new XML();
data_xml = item_xml.firstChild;
while (data_xml != null) {
BodyChartData[data_xml.nodeName] = data_xml.firstChild.nodeValue;

var x = data_xml.attributes;
for (var att in x) {
BodyChartData[att] = x[att];
}//end for

data_xml = data_xml.nextSibling;
}//end while
return BodyChartData;
}//end function

}// end class


<?xml version="1.0"?>
<bodychart>
<item>
<item_name trans_name="Right Foot"><![CDATA[RFoot]]></item_name>
<highlight_color><![CDATA[000000]]></highlight_color>
<xray xray_date="12-01-2005 15:02" xray_short="X-ray/MRI Findings/Relevant Info" xray_attendee="Dr. Smith"><![CDATA[<b>X-ray/MRI Findings/Relevant Info</b><br>Post emensos insuperabilis expeditionis eventus languentibus partium animis, quas periculorum varietas fregerat et laborum, nondum tubarum cessante clangore vel milite locato per stationes hibernas, fortunae saevientis procellae tempestates alias rebus infudere communibus per multa illa et dira facinora Caesaris Galli, qui ex squalore imo miseriarum in aetatis adultae primitiis ad principale culmen insperato saltu provectus ultra terminos potestatis delatae procurrens asperitate nimia cuncta foedabat. propinquitate enim regiae stirpis gentilitateque etiam tum Constantini nominis efferebatur in fastus, si plus valuisset, ausurus hostilia in auctorem suae felicitatis, ut videbatur.<br><br>]]></xray>
<surgeries surgeries_date="12-01-2005 15:55" surgeries_short="Surgeries" surgeries_attendee="Dr. Smith"><![CDATA[<b>Surgeries</b><br>Cuius acerbitati uxor grave accesserat incentivum, germanitate Augusti turgida supra modum, quam Hannibaliano regi fratris filio antehac Constantinus iunxerat pater, Megaera quaedam mortalis, inflammatrix saevientis adsidua, humani cruoris avida nihil mitius quam maritus; qui paulatim eruditiores facti processu temporis ad nocendum per clandestinos versutosque rumigerulos conpertis leviter addere quaedam male suetos falsa et placentia sibi discentes, adfectati regni vel artium nefandarum calumnias insontibus adfligebant.<br><br>]]></surgeries>
<diagnosis diagnosis_date="12-01-2005 17:12" diagnosis_short="Diagnosis" diagnosis_attendee="Dr. Smith"><![CDATA[<b>Diagnosis</b><br>eminuit autem inter humilia supergressa iam impotentia fines mediocrium delictorum nefanda Clematii cuiusdam Alexandrini nobilis mors repentina; cuius socrus cum misceri sibi generum, flagrans eius amore, non impetraret, ut ferebatur, per palatii pseudothyrum introducta, oblato pretioso reginae monili id adsecuta est, ut ad Honoratum tum comitem orientis formula missa letali omnino scelere nullo contactus idem Clematius nec hiscere nec loqui permissus occideretur.]]></diagnosis>
</item>
<item>
<item_name trans_name="Left Foot"><![CDATA[LFoot]]></item_name>
<highlight_color><![CDATA[FF0000]]></highlight_color>
<xray xray_date="01-25-2006 08:10" xray_short="X-ray/MRI Findings/Relevant Info" xray_attendee="Dr. Thompson"><![CDATA[<b>X-ray/MRI Findings/Relevant Info</b><br>Post emensos insuperabilis expeditionis eventus languentibus partium animis, quas periculorum varietas fregerat et laborum, nondum tubarum cessante clangore vel milite locato per stationes hibernas, fortunae saevientis procellae tempestates alias rebus infudere communibus per multa illa et dira facinora Caesaris Galli, qui ex squalore imo miseriarum in aetatis adultae primitiis ad principale culmen insperato saltu provectus ultra terminos potestatis delatae procurrens asperitate nimia cuncta foedabat. propinquitate enim regiae stirpis gentilitateque etiam tum Constantini nominis efferebatur in fastus, si plus valuisset, ausurus hostilia in auctorem suae felicitatis, ut videbatur.<br><br>]]></xray>
<surgeries surgeries_date="01-25-2006 08:50" surgeries_short="Surgeries" surgeries_attendee="Dr. Thompson"><![CDATA[<b>Surgeries</b><br>Cuius acerbitati uxor grave accesserat incentivum, germanitate Augusti turgida supra modum, quam Hannibaliano regi fratris filio antehac Constantinus iunxerat pater, Megaera quaedam mortalis, inflammatrix saevientis adsidua, humani cruoris avida nihil mitius quam maritus; qui paulatim eruditiores facti processu temporis ad nocendum per clandestinos versutosque rumigerulos conpertis leviter addere quaedam male suetos falsa et placentia sibi discentes, adfectati regni vel artium nefandarum calumnias insontibus adfligebant.<br><br>]]></surgeries>
<diagnosis diagnosis_date="01-25-2006 09:01" diagnosis_short="Diagnosis" diagnosis_attendee="Dr. Thompson"><![CDATA[<b>Diagnosis</b><br>eminuit autem inter humilia supergressa iam impotentia fines mediocrium delictorum nefanda Clematii cuiusdam Alexandrini nobilis mors repentina; cuius socrus cum misceri sibi generum, flagrans eius amore, non impetraret, ut ferebatur, per palatii pseudothyrum introducta, oblato pretioso reginae monili id adsecuta est, ut ad Honoratum tum comitem orientis formula missa letali omnino scelere nullo contactus idem Clematius nec hiscere nec loqui permissus occideretur.]]></diagnosis>
</item>
</bodychart>

Let me know if you come up with an improvement or fix for the known rough spots... feel free to use any or all of this for your project if it helps you.

Thanks,
Bill

jsebrech
04-15-2005, 08:06 AM
Coming from someone trying to import large server-generated XML files, I can assure you that you definitely want to do as much as you possibly can server-side. Also, in my experience it's more performant to bundle a bunch of attributes together in one large attribute with values internally separated by delimiters, and to then turn that attribute into an array of values by judicious use of the String.split command.

Now that I think of it, it might even be faster to skip XML altogether, and format an entire file like that, where you keep applying String.split to subdivide array elements. Something to test some time...

hangalot
04-15-2005, 08:35 AM
You must know the names of the attributes and nodes in the xml file, and reference them by name, this doesnt really allowyou to have an unknown number of cghildren to the <item> node, does it? I have an idea of how to fix this but haven't spent the time yet... it's possible to parse the attribute names and assign them to vars used to reference their values in the array

its an associative array so you can do what you do with arrays.

xml parsing is crap and tends to be buggy since most people strucggle thinking recusively for some reason. use XPATH this makes life a lot easier since it works.

bilsalak
04-15-2005, 05:39 PM
I've never heard about xPath in Flash until now. My only concern is that the implementation in Flash seems to have cut out most of the features for this standard. I can't foresee this being a problem in this application but it's what you can't see that screws up your day...

any thoughts ? anyone experience problems due to lack-luster support of xPath in Flash?

Thanks,
bill

hangalot
04-16-2005, 10:14 AM
the macromedia xpath included is crap. i use the one from www.xfactorstudio.com