// 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()>