Every now and again you find something in Flash that you can’t believe you’ve ever lived with out. Thank goodness Tom Kennett (one of the FlashCodersBrighton) showed me the FlashMX XPathAPI. Never will I have to custom write an XML parser again!
To use the XPathAPI, first you import the library :
Let’s say you have the XML file containing this :
C0201.swf html red PLUG-IN-O-VISION IS REVEALED
GEE-WHIZZ Plug-in's all new website has launched!FLASH FORWARD in Texas SPEAKER SHOCKER! Plug-in's technical director presents 3D in Flash at FlashForward Texas.Plug-in Media Directs Sony Video Nasty! Sony called upon Plug-in Media to produce EyeToy Next Generation promotional film.
First of all we need to extract the main node out of the XML object:
var mainnode : XMLNode = myXMLObject.firstChild;
Now using XPathAPI we can get any subsequent node value easily! To get the contents of the tag, we use:
textcolour = XPathAPI.selectSingleNode(mainnode, "news/options/textcolour").firstChild.nodeValue;
You can see there that we can access nodes within the XML structure in the same way that we would access files in a directory tree : “news/options/textcolour”. As the selectSingleNode function returns (unsurprisingly) an XMLNode, we get the contents of that node using .firstChild.nodeValue.
But an even better feature of the XPathAPI is the selectNodeList() method which returns an array of nodes!
For a fuller explanation, check out this informative post at Last Actionscript Hero.
9 replies on “XML parsing in Actionscript made easy with Flash XPath – who knew?”
I had to give up Macromedia’s xpath and use the xfactorstudio instead for a simple, but serious, reason: You can’t go “up” one level on the xml tree with macromedia implementation;
for example, if you want to go “down”, you use /level/level, and up /level/../../ – the classic slash/dot syntax. If you want to select the parent node of all nodes that contain a certain keyword, you’re in trouble. And that not a usual query…
Thank you very much !!!
With a small (
under 512Kb XML document, it’s often best (e.g. if you’re doing multiple lookups to the file) to parse the whole file to convert it to an AS Object.
There’s several implementations of this process, I posted an AS1 prototype a few years ago on http://proto.layer51.com/d.aspx?f=964
If you like I’ll post you up an AS2.0 event driven class.
Using this method, the lookup in your example would be…
textcolour = myXML.news.options.textcolour._value;
Note: Multiple nodes would be parsed as arrays… eg.
myXML.news.stories.story.heading._value == “PLUG-IN-O-VISION IS REVEALED”
a lot less bovver I think you’ll agree.
Thats interesting I have built an XML to Array parser for AS 2.0 its not bad we use it all the time least till e4x comes with our AS 3.0 projects.
I intend to continue development in any case adding to it with e4x soon. If interested the source code is open http://www.flashdynamix.com/blog/?p=4
Thanks Shane, it seems like there are a few options here, will def be exploring your code next time I need an XML parser!