// struct to store 'member' variables (or properties)
variables.member = StructNew();
// identifies the type of the Xml source supplied to the object (file, string, url or CFXml)
member.sourceType = "No Xml Loaded";
// create xml object
if( StructKeyExists(arguments,'src') )
Load(arguments.src);
else
member.xmlDoc = XmlNew();
// create XPath helper
member.xPathHelper = CreateObject("java","org.apache.xpath.XPathAPI");
member.namespaces = QueryNew('uri,prefix');
return this;
QueryAddRow(member.namespaces);
QuerySetCell(member.namespaces, 'uri', arguments.uri);
QuerySetCell(member.namespaces, 'prefix', arguments.prefix);
var nodes = XPathResults(arguments.XPath);
var nNodes = nodes.GetLength();
var node = "";
var children = "";
var aResult = ArrayNew(1);
var converted = "";
var i = 0;
var n = 0;
var bMixedContent = NodeListNames(nodes).Size() - 1;
var stTemp = StructNew();
var aComplexTypes = ListToArray("1,9,11");
// no results, return empty array
if(not nNodes)
return aResult;
// loop the node results and append each node to the results array (after converting it)
for(i=0; i LT nNodes; i=i+1)
{
node = nodes.item(javacast('int',i));
if(StructKeyExists(arguments, 'childFilter'))
converted = ConvertNode(node, arguments.childFilter);
else
converted = ConvertNode(node);
// if mixed content and node is an element, document or doc fragment, create a structure and key for it.
if( bMixedContent and aComplexTypes.contains(node.GetNodeType()) )
{
stTemp.clear();
stTemp[ node.GetNodeName() ] = converted;
ArrayAppend(aResult,sttemp);
}
// else, if it's not a blank string then add it
else if(not ( IsSimpleValue(converted) and not Len(Trim(converted)) ) )
ArrayAppend(aResult,converted);
}
return aResult;
var aValue = "";
var aArr = "";
var child = "";
var children = "";
var converted = "";
var bFinished = false;
var sKey = "";
var i = 0;
switch(node.GetNodeType())
{
//case 'Attribute': case 'Text': case 'CDATA': case 'Comment': case 'Notation':{
case 2: case 3: case 4: case 8: case 12:{
if(StructKeyExists(arguments, 'childFilter'))
return "";
return node.GetNodeValue();
}
//case 'Processing Instruction':{
case 7:{
if(StructKeyExists(arguments, 'childFilter'))
return "";
aValue = StructNew();
aValue[node.GetNodeName()] = node.GetNodeValue();
return aValue;
}
//case 'Element': case 'Document': case 'Document Fragment':
case 1: case 9: case 11:
{
// no child elements or attributes, just get the element text
if(not NodeListContainsTypes(node.GetChildNodes(),'1') AND not node.GetAttributes().GetLength())
{
if(StructKeyExists(arguments, 'childFilter'))
return "";
// get text
child = member.xPathHelper.SelectNodeList(node,'./text()');
if(not child.GetLength())
return "";
else if(child.GetLength() EQ 1)
return child.item(0).GetNodeValue();
else
{
aValue = StructNew();
aArr = ArrayNew(1);
for(i=0; i LT child.GetLength(); i=i+1)
ArrayAppend(aArr, child.item(javacast('int',i)).GetNodeValue());
aValue.xmlText = aArr;
return aValue;
}
}
// element contains children / attributes - make a structure of it
else
{
// get structure of the children and attributes
aValue = StructNew();
children = node.GetChildNodes();
if(children.GetLength())
{
for(i=0; i LT children.GetLength(); i=i+1)
{
child = children.item(javacast('int',i));
if(StructKeyExists(arguments, 'childFilter') and not ListFind(arguments.childFilter, child.GetNodeName()))
continue;
// only add child elements and text nodes (that aren't blank)
if(ListFind("1,3", child.GetNodeType()))
{
converted = ConvertNode(child);
if(not (IsSimpleValue(converted) AND Trim(converted) EQ "") )
{
if(child.GetNodeType() EQ 3)
sKey = "xmlText";
else
sKey = child.GetNodeName();
if(StructKeyExists(aValue, sKey))
{
if(not IsArray(aValue[child.GetNodeName()]))
{
aArr = ArrayNew(1);
ArrayAppend(aArr, aValue[sKey]);
ArrayAppend(aArr, converted);
aValue[sKey] = aArr;
}else
ArrayAppend(aValue[child.GetNodeName()], converted);
}
else
aValue[sKey] = converted;
}
}
}
}
if(node.HasAttributes())
{
children = node.GetAttributes();
for(i=0; i LT children.GetLength(); i=i+1)
{
child = children.item(javacast('int',i));
if(not StructKeyExists(arguments, 'childFilter') or ListFind(arguments.childFilter, child.GetNodeName()))
{
if( StructKeyExists(aValue, child.GetNodeName()) )
{
if(not IsArray(aValue[child.GetNodeName()]))
{
aArr = ArrayNew(1);
ArrayAppend(aArr, aValue[child.GetNodeName()]);
ArrayAppend(aArr, child.GetNodeValue());
aValue[child.GetNodeName()] = aArr;
}else
ArrayAppend(aValue[child.GetNodeName()], child.GetNodeValue());
}
else
aValue[child.GetNodeName()] = child.GetNodeValue();
}
}
}
if(aValue.isEmpty())
return "";
return aValue;
}
}
default: return type;
}
switch(arguments.nodeType)
{
case 1: return "Element";
case 2: return "Attribute";
case 3: return "Text";
case 4: return "CDATA";
case 5: return "Entity Reference";
case 6: return "Entity";
case 7: return "Processing Instruction";
case 8: return "Comment";
case 9: return "Document";
case 10: return "Document Type";
case 11: return "Document Fragment";
case 12: return "Notation";
default: return "Unknown";
}
var i=0;
for(i=0; i LT nodeList.GetLength(); i=i+1)
{
if(ListFind(arguments.types, nodeList.item(javacast('int',i)).GetNodeType()))
return true;
}
return false;
var i=0;
var aNames = ArrayNew(1);
for(i=0; i LT arguments.nodeList.GetLength(); i=i+1)
{
if(aNames.IndexOf(arguments.nodeList.item(javacast('int',i)).GetNodeName()) EQ -1)
ArrayAppend(aNames, arguments.nodeList.item(javacast('int',i)).GetNodeName());
}
return aNames;
").GetDocumentElement().GetOwnerDocument()>