all groups > flash data integration > august 2006 >
You're in the

flash data integration

group:

traversing the XML data tree


traversing the XML data tree Goo101
8/25/2006 12:00:00 AM
flash data integration:
I have the following layout to my XML file . . .

<?xml version="1.0" encoding="UTF-8" ?>
<VoucherNumbers>
<GoodVoucher>20060820151601</GoodVoucher>
<CancelVoucher>
<CancelledVoucher>20060820091501</CancelledVoucher>
<CancelledVoucher>20060820102201</CancelledVoucher>
<CancelledVoucher>20060820105401</CancelledVoucher>
<CancelledVoucher>20060820114201</CancelledVoucher>
</CancelVoucher>
</VoucherNumbers>

I am trying to access the values in the various child nodes in the
'CancelledVoucher' field and the following code is returning the value of the
firstChild at that level (i.e. "20060820091501") . . .

function doAfterXmlDataIsLoaded(){
//read the XML data
var vnData:XMLNode = VoucherNumbers.firstChild; //nodeType = 1
var vnCancel:XMLNode = vnData.firstChild.nextSibling; //nodeType = 1
var vnCancelled:XMLNode = vnCancel.firstChild; //nodeType = 1
var vnCanVoucher:Array = vnCancelled.childNodes[0]; //nodeType = 3
trace(vnCanVoucher);
}

I know this is the same as coding . . .

var vnCanVoucher:Array =
vnData.firstChild.nextSibling.firstChild.childNodes[0]; //nodeType = 3

But I wanted to split the levels of the data drill down so I'm more sure of my
XML data structure. But what I can't do to access the values in the remaining
childNodes . . . or even better to search through these childNodes to find the
right value as compared to the value stored in another variable in the code?

I have tried the following lines of code to access the values in the child
Nodes array but with little success . . .

var vnCanVoucher:Array = vnCancelled.childNodes[1] //nodeType = 3 . . .
returns "undefined"
var vnCanVoucher:Array = vnCancelled.childNodes[0].nextSibling; //nodeType =
3 . . . returns "null"
var vnCanVoucher:Array = vnCancelled.childNodes[0].firstChild; //nodeType =
3 . . . returns "null"
var vnCanVoucher:Array = vnCancelled.childNodes[0].lastChild; //nodeType = 3
.. . . returns "null"
var vnCanVoucher:Array = vnCancelled.childNodes[0].childNodes[0]; //nodeType
= 3 . . . returns "undefined"

I can't quite understand where I'm going wrong here. I really thought
"vnCancelled.childNodes[0].nextSibling;" would work but obviously not. If
anyone can help point out where I'm going wrong that would be a great help.

Thank you!
Re: traversing the XML data tree Raymond Basque
8/26/2006 12:00:00 AM
<?xml version="1.0" encoding="UTF-8" ?>
<VoucherNumbers>
<GoodVoucher>20060820151601</GoodVoucher>
<CancelVoucher>
<CancelledVoucher>20060820091501</CancelledVoucher>
<CancelledVoucher>20060820102201</CancelledVoucher>
<CancelledVoucher>20060820105401</CancelledVoucher>
<CancelledVoucher>20060820114201</CancelledVoucher>
</CancelVoucher>
</VoucherNumbers>

var vnData:XMLNode = VoucherNumbers.firstChild;
// returns the root node

var vnCancel:XMLNode = vnData.firstChild.nextSibling;
// returns the <CancelVoucher/> node
// this is OK if you are sure the node will always be
// after the <GoodVoucher/> node

var vnCancelled:XMLNode = vnCancel.firstChild;
// returns the first <CancelledVoucher/> node
// <CancelledVoucher>20060820091501</CancelledVoucher>


var vnCanVoucher:XMLNode = vnCancelled.childNodes[0];
// note: in the Flash XML world, all text is wrapped in
// an invisible XMLNode (type 3)
// returns the type 3 node in the
// first <CancelledVoucher/> node
// <CancelledVoucher>
// <invisibleTextNode>20060820091501</invisibleTextNode>
// </CancelledVoucher>
// note: this is an XMLNode -- not an array



var vnCanVoucher:Array = vnCancelled.childNodes[1]
// you are trying to get the second child node in the
// first <CancelledVoucher/> node -- it does not exist
// returns "undefined"

var vnCanVoucher:Array = vnCancelled.childNodes[0].nextSibling;
// you are trying to get the second child node in the
// first <CancelledVoucher/> node -- it does not exist
// returns "null"


var vnCanVoucher:Array = vnCancelled.childNodes[0].firstChild;
// you are trying to get the first child node in the
// text node-- it does not exist
// returns "null"


var vnCanVoucher:Array = vnCancelled.childNodes[0].lastChild;
// you are trying to get the last child node in the
// text node-- it does not exist
// returns "null"

var vnCanVoucher:Array = vnCancelled.childNodes[0].childNodes[0];
// you are trying to get the first child node in the
// text node-- it does not exist
// returns "null"


you could use this to iterate the <CancelledVoucher/> nodes:

for (var j=0; j<vnCancel.childNodes.length; j++){
var vnCancelled:XMLNode = vnCancel.childNodes[j];
var vnCanVoucher:XMLNode = vnCancelled.childNodes[0];
trace(vnCanVoucher.nodeValue;
}




I threw a bit of code together that might get you on the right track.
Note: I use mx.xpath.XPathAPI for most of my XML work. It's not a very
robust XPath API, but it serves its purpose.

import mx.xpath.XPathAPI;

// this is a recursive utility function to retrieve
// an XMLNode.nodeValue
function getNodeValue(n:XMLNode){
if (n==undefined){return "";}
if (n.nodeValue){return n.nodeValue;}
// the node doesn't have a value so find a child node that does.
return getNodeValue(n.firstChild);
}

var vnData:XMLNode = VoucherNumbers.firstChild; //nodeType = 1
var vnGood:XMLNode = vnData.firstChild;
var vnCancel:XMLNode = vnData.firstChild.nextSibling; //nodeType = 1

// OR USE XPath
var vnGood:XMLNode = XPathAPI.selectSingleNode(vnData,"*/GoodVoucher");
var vnCancel:XMLNode = XPathAPI.selectSingleNode(vnData,"*/CancelVoucher");

function getCancelledVoucherNodes(useXPath:Boolean){
if (useXPath){
return XPathAPI.selectNodeList(vnData,"*/CancelVoucher/CancelledVoucher");
}
else{
return vnCancel.childNodes;
}
}
function getCancelledVoucherNumbers(useXPath:Boolean){
var result= new Array();
result.length=0;
var list = getCancelledVoucherNodes(useXPath);
for(var i=0; i<list.length; i++){
result.push(getNodeValue(list[i]));
}
return result;
}
trace("\nGood voucher node: " + vnGood);
trace("\nGood voucher number: " + getNodeValue(vnGood));
trace("\nCancel voucher node: " + vnCancel);
trace("\nCancelledVoucher voucher nodes: " +
getCancelledVoucherNodes(true));
trace("\nCancelledVoucher voucher numbers: " +
getCancelledVoucherNumbers(true));


Hope this helps.

Cheers!


AddThis Social Bookmark Button