| 1 |
////////////////////////////////////////////////////////// |
| 2 |
////////// JSXML XML Tools //////////// |
| 3 |
////////// Ver 1.3 Aug 29 2009 //////////// |
| 4 |
////////// Copyright 2000-2009 Peter Tracey //////////// |
| 5 |
////////// http://levelthreesoltions.com/jsxml/ |
| 6 |
//// |
| 7 |
//// Objects: |
| 8 |
//// |
| 9 |
//// REXML |
| 10 |
//// Regular Expression-based XML parser |
| 11 |
//// |
| 12 |
//// JSXMLIterator |
| 13 |
//// Iterates through the tree structure without recursion |
| 14 |
//// |
| 15 |
//// JSXMLBuilder |
| 16 |
//// Loads xml into a linear structure and provides |
| 17 |
//// interface for adding and removing elements |
| 18 |
//// and setting attributes, generates XML |
| 19 |
//// |
| 20 |
//// Utility functions: |
| 21 |
//// |
| 22 |
//// ParseAttribute |
| 23 |
//// Takes string of attibutes and attribute name |
| 24 |
//// Returns attribute value |
| 25 |
//// |
| 26 |
//// Array_Remove |
| 27 |
//// Removes element in array |
| 28 |
//// |
| 29 |
//// Array_Add |
| 30 |
//// Adds element to array |
| 31 |
//// |
| 32 |
//// RepeatChar |
| 33 |
//// Repeats string specified number of times |
| 34 |
//// |
| 35 |
/////////////////////////////////////////////////////////////// |
| 36 |
|
| 37 |
|
| 38 |
function REXML(XML) { |
| 39 |
this.XML = XML; |
| 40 |
|
| 41 |
this.rootElement = null; |
| 42 |
|
| 43 |
this.parse = REXML_parse; |
| 44 |
if (this.XML && this.XML !== "") this.parse(); |
| 45 |
} |
| 46 |
|
| 47 |
function REXML_parse() { |
| 48 |
var reTag = new RegExp("<([^>/ ]*)([^>]*)>","g"); // matches that tag name $1 and attribute string $2 |
| 49 |
var reTagText = new RegExp("<([^>/ ]*)([^>]*)>([^<]*)","g"); // matches tag name $1, attribute string $2, and text $3 |
| 50 |
var strType = ""; |
| 51 |
var strTag = ""; |
| 52 |
var strText = ""; |
| 53 |
var strAttributes = ""; |
| 54 |
var strOpen = ""; |
| 55 |
var strClose = ""; |
| 56 |
var iElements = 0; |
| 57 |
var xmleLastElement = null; |
| 58 |
if (this.XML.length === 0) return; |
| 59 |
var arrElementsUnparsed = this.XML.match(reTag); |
| 60 |
var arrElementsUnparsedText = this.XML.match(reTagText); |
| 61 |
var i=0; |
| 62 |
if (arrElementsUnparsed[0].replace(reTag, "$1") == "?xml") i++; |
| 63 |
|
| 64 |
for (; i<arrElementsUnparsed.length; i++) { |
| 65 |
strTag = arrElementsUnparsed[i].replace(reTag,"$1"); |
| 66 |
strAttributes = arrElementsUnparsed[i].replace(reTag,"$2"); |
| 67 |
strText = arrElementsUnparsedText[i].replace(reTagText,"$3").replace(/[\r\n\t ]+/g, " "); // remove white space |
| 68 |
strClose = ""; |
| 69 |
if (strTag.indexOf("![CDATA[") === 0) { |
| 70 |
strOpen = "<![CDATA["; |
| 71 |
strClose = "]]>"; |
| 72 |
strType = "cdata"; |
| 73 |
} else if (strTag.indexOf("!--") === 0) { |
| 74 |
strOpen = "<!--"; |
| 75 |
strClose = "-->"; |
| 76 |
strType = "comment"; |
| 77 |
} else if (strTag.indexOf("?") === 0) { |
| 78 |
strOpen = "<?"; |
| 79 |
strClose = "?>"; |
| 80 |
strType = "pi"; |
| 81 |
} else strType = "element"; |
| 82 |
if (strClose !== "") { |
| 83 |
strText = ""; |
| 84 |
if (arrElementsUnparsedText[i].indexOf(strClose) > -1) strText = arrElementsUnparsedText[i]; |
| 85 |
else { |
| 86 |
for (; i<arrElementsUnparsed.length && arrElementsUnparsedText[i].indexOf(strClose) == -1; i++) { |
| 87 |
strText += arrElementsUnparsedText[i]; |
| 88 |
} |
| 89 |
strText += arrElementsUnparsedText[i]; |
| 90 |
} |
| 91 |
if (strText.substring(strOpen.length, strText.indexOf(strClose)) !== "") { |
| 92 |
xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, "","",xmleLastElement,strText.substring(strOpen.length, strText.indexOf(strClose))); |
| 93 |
if (strType == "cdata") xmleLastElement.text += strText.substring(strOpen.length, strText.indexOf(strClose)); |
| 94 |
} |
| 95 |
if (strText.indexOf(strClose)+ strClose.length < strText.length) { |
| 96 |
xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText.substring(strText.indexOf(strClose)+ strClose.length, strText.length)); |
| 97 |
if (strType == "cdata") xmleLastElement.text += strText.substring(strText.indexOf(strClose)+ strClose.length, strText.length); |
| 98 |
} |
| 99 |
continue; |
| 100 |
} |
| 101 |
if (strText.replace(/ */, "") === "") strText = ""; |
| 102 |
if (arrElementsUnparsed[i].substring(1,2) != "/") { |
| 103 |
if (iElements === 0) { |
| 104 |
xmleLastElement = this.rootElement = new REXML_XMLElement(strType, strTag,strAttributes,null,strText); |
| 105 |
iElements++; |
| 106 |
if (strText !== "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); |
| 107 |
} else if (arrElementsUnparsed[i].substring(arrElementsUnparsed[i].length-2,arrElementsUnparsed[i].length-1) != "/") { |
| 108 |
xmleLastElement = xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, strTag,strAttributes,xmleLastElement,""); |
| 109 |
iElements++; |
| 110 |
if (strText !== "") { |
| 111 |
xmleLastElement.text += strText; |
| 112 |
xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); |
| 113 |
} |
| 114 |
} else { |
| 115 |
xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, strTag,strAttributes,xmleLastElement,strText); |
| 116 |
if (strText !== "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); |
| 117 |
} |
| 118 |
} else { |
| 119 |
xmleLastElement = xmleLastElement.parentElement; |
| 120 |
iElements--; |
| 121 |
if (xmleLastElement && strText !== "") { |
| 122 |
xmleLastElement.text += strText; |
| 123 |
xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText); |
| 124 |
} |
| 125 |
} |
| 126 |
} |
| 127 |
} |
| 128 |
|
| 129 |
function REXML_XMLElement(strType, strName, strAttributes, xmlParent, strText) { |
| 130 |
this.type = strType; |
| 131 |
this.name = strName; |
| 132 |
this.attributeString = strAttributes; |
| 133 |
this.attributes = null; |
| 134 |
this.childElements = []; |
| 135 |
this.parentElement = xmlParent; |
| 136 |
this.text = strText; // text of element |
| 137 |
|
| 138 |
this.getText = REXML_XMLElement_getText; // text of element and child elements |
| 139 |
this.childElement = REXML_XMLElement_childElement; |
| 140 |
this.attribute = REXML_XMLElement_attribute; |
| 141 |
} |
| 142 |
|
| 143 |
function REXML_XMLElement_getText() { |
| 144 |
if (this.type == "text" || this.type == "cdata") { |
| 145 |
return this.text; |
| 146 |
} else if (this.childElements.length) { |
| 147 |
var L = ""; |
| 148 |
for (var i=0; i<this.childElements.length; i++) { |
| 149 |
L += this.childElements[i].getText(); |
| 150 |
} |
| 151 |
return L; |
| 152 |
} else return ""; |
| 153 |
} |
| 154 |
|
| 155 |
function REXML_XMLElement_childElement(strElementName) { |
| 156 |
for (var i=0; i<this.childElements.length; i++) if (this.childElements[i].name == strElementName) return this.childElements[i]; |
| 157 |
return null; |
| 158 |
} |
| 159 |
|
| 160 |
function REXML_XMLElement_attribute(strAttributeName) { |
| 161 |
if (!this.attributes) { |
| 162 |
var reAttributes = new RegExp(" ([^= ]*)=","g"); // matches attributes |
| 163 |
if (this.attributeString.match(reAttributes) && this.attributeString.match(reAttributes).length) { |
| 164 |
var arrAttributes = this.attributeString.match(reAttributes); |
| 165 |
if (!arrAttributes.length) arrAttributes = null; |
| 166 |
else for (var j=0; j<arrAttributes.length; j++) { |
| 167 |
arrAttributes[j] = new Array( |
| 168 |
(arrAttributes[j]+"").replace(/[= ]/g,""), |
| 169 |
ParseAttribute(this.attributeString, (arrAttributes[j]+"").replace(/[= ]/g,"")) |
| 170 |
); |
| 171 |
} |
| 172 |
this.attributes = arrAttributes; |
| 173 |
} |
| 174 |
} |
| 175 |
if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == strAttributeName) return this.attributes[i][1]; |
| 176 |
return ""; |
| 177 |
} |
| 178 |
|
| 179 |
|
| 180 |
function JSXMLBuilder() { |
| 181 |
this.XML = ""; |
| 182 |
this.elements = []; |
| 183 |
Array.prototype.remove = Array_Remove; |
| 184 |
Array.prototype.add = Array_Add; |
| 185 |
|
| 186 |
this.load = JSXMLBuilder_load; |
| 187 |
this.element = JSXMLBuilder_element; |
| 188 |
this.addElementAt = JSXMLBuilder_addElementAt; |
| 189 |
this.insertElementAt = JSXMLBuilder_insertElementAt; |
| 190 |
this.removeElement = JSXMLBuilder_removeElement; |
| 191 |
this.generateXML = JSXMLBuilder_generateXML; |
| 192 |
this.moveElement = JSXMLBuilder_moveElement; |
| 193 |
} |
| 194 |
|
| 195 |
function JSXMLBuilder_load(strXML, xmleElem) { |
| 196 |
this.XML = strXML; |
| 197 |
|
| 198 |
if (!xmleElem) { |
| 199 |
if (strXML.length) xmleElem = (new REXML(strXML)).rootElement; |
| 200 |
else return false; |
| 201 |
} |
| 202 |
|
| 203 |
var xmlBuilder = new JSXMLIterator(xmleElem); |
| 204 |
|
| 205 |
while (true) { |
| 206 |
if (xmlBuilder.xmleElem.type == "element") { |
| 207 |
if (xmlBuilder.xmleElem.attributes) { |
| 208 |
this.addElementAt(xmlBuilder.xmleElem.name,xmlBuilder.xmleElem.attributes, xmlBuilder.xmleElem.text, this.elements.length, xmlBuilder.iElemLevel); |
| 209 |
} else { |
| 210 |
this.addElementAt(xmlBuilder.xmleElem.name,xmlBuilder.xmleElem.attributeString, xmlBuilder.xmleElem.text, this.elements.length, xmlBuilder.iElemLevel); |
| 211 |
} |
| 212 |
} |
| 213 |
if (!xmlBuilder.getNextNode(false)) break; |
| 214 |
} |
| 215 |
for (var i=0; i<this.elements.length; i++) this.elements[i].index = i; |
| 216 |
} |
| 217 |
|
| 218 |
function JSXMLBuilder_element(iIndex) { |
| 219 |
return this.elements[iIndex]; |
| 220 |
} |
| 221 |
|
| 222 |
function JSXMLBuilder_addElementAt(strElement,Attributes,strText,iElemIndex,iElemLevel) { |
| 223 |
iElemIndex = parseInt(iElemIndex); |
| 224 |
iElemLevel = parseInt(iElemLevel); |
| 225 |
if (iElemIndex < 0 || typeof(iElemIndex) != "number" || isNaN(iElemIndex)) iElemIndex = (this.elements.length>0) ? this.elements.length-1 : 0; |
| 226 |
if (iElemLevel < 0 || typeof(iElemLevel) != "number" || isNaN(iElemLevel)) iElemLevel = this.elements[iElemIndex-1].level; |
| 227 |
if (!Attributes) Attributes = ""; |
| 228 |
var Elem = []; |
| 229 |
var iAddIndex = iElemIndex; |
| 230 |
if (iElemIndex > 0) { |
| 231 |
for (var i=iElemIndex; i<this.elements.length; i++) if (this.elements[i].level > iElemLevel) iAddIndex++; |
| 232 |
else if (this.elements[i].level <= this.elements[iElemIndex].level) break; |
| 233 |
Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,iElemLevel+1,this); |
| 234 |
} else { |
| 235 |
Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,1,this); |
| 236 |
} |
| 237 |
this.elements = this.elements.add(iAddIndex,Elem); |
| 238 |
for (var i=iAddIndex; i<this.elements.length; i++) this.elements[i].index = i; |
| 239 |
} |
| 240 |
|
| 241 |
function JSXMLBuilder_insertElementAt(strElement,Attributes,strText,iElemIndex,iElemLevel) { |
| 242 |
iElemIndex = parseInt(iElemIndex); |
| 243 |
iElemLevel = parseInt(iElemLevel); |
| 244 |
if (iElemIndex < 0 || typeof(iElemIndex) != "number" || isNaN(iElemIndex)) iElemIndex = (this.elements.length>0) ? this.elements.length-1 : 0; |
| 245 |
if (iElemLevel < 0 || typeof(iElemLevel) != "number" || isNaN(iElemLevel)) iElemLevel = this.elements[iElemIndex-1].level; |
| 246 |
if (!Attributes) Attributes = ""; |
| 247 |
var Elem = null; |
| 248 |
var iAddIndex = iElemIndex; |
| 249 |
if (iElemIndex > 0 && iElemLevel > 0) { |
| 250 |
Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,iElemLevel+1,this); |
| 251 |
} else { |
| 252 |
Elem = new JSXMLBuilder_XMLElement(strElement,Attributes,strText,1,this); |
| 253 |
} |
| 254 |
this.elements = this.elements.add(iAddIndex,Elem); |
| 255 |
for (var i=iAddIndex; i<this.elements.length; i++) this.elements[i].index = i; |
| 256 |
} |
| 257 |
|
| 258 |
|
| 259 |
function JSXMLBuilder_removeElement(iElemIndex) { |
| 260 |
iElemIndex = parseInt(iElemIndex); |
| 261 |
for (var iAfterElem=iElemIndex+1; iAfterElem<this.elements.length; iAfterElem++) if (this.elements[iAfterElem].level < this.elements[iElemIndex].level+1) break; |
| 262 |
|
| 263 |
this.elements = this.elements.slice(0,iElemIndex).concat(this.elements.slice(iAfterElem,this.elements.length)); |
| 264 |
for (var i=iElemIndex; i<this.elements.length; i++) this.elements[i].index = i; |
| 265 |
} |
| 266 |
|
| 267 |
function JSXMLBuilder_moveElement(iElem1Index,iElem2Index) { |
| 268 |
var arrElem1Elements = new Array(this.elements[iElem1Index]); |
| 269 |
var arrElem2Elements = new Array(this.elements[iElem2Index]); |
| 270 |
for (var i=iElem1Index; i<this.elements.length; i++) if (this.elements[i].level > this.elements[iElem1Index].level) arrElem1Elements[arrElem1Elements.length] = this.elements[i]; else if (i>iElem1Index) break; |
| 271 |
for (var i=iElem2Index; i<this.elements.length; i++) if (this.elements[i].level > this.elements[iElem2Index].level) arrElem2Elements[arrElem2Elements.length] = this.elements[i]; else if (i>iElem2Index) break; |
| 272 |
var arrMovedElements = []; |
| 273 |
if (iElem1Index < iElem2Index) { |
| 274 |
for (i=0; i<iElem1Index; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // start to the 1st element |
| 275 |
for (i=iElem1Index+arrElem1Elements.length; i<iElem2Index+arrElem2Elements.length; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // end of 1st element to end of 2nd element |
| 276 |
for (i=0; i<arrElem1Elements.length; i++) arrMovedElements[arrMovedElements.length] = arrElem1Elements[i]; // 1st element and all child elements |
| 277 |
for (i=iElem2Index+arrElem2Elements.length; i<this.elements.length; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // end of 2nd element to end |
| 278 |
this.elements = arrMovedElements; |
| 279 |
} else { |
| 280 |
for (i=0; i<iElem2Index; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // start to the 2nd element |
| 281 |
for (i=0; i<arrElem1Elements.length; i++) arrMovedElements[arrMovedElements.length] = arrElem1Elements[i]; // 1st element and all child elements |
| 282 |
for (i=iElem2Index; i<iElem1Index; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // 2nd element to 1st element |
| 283 |
for (i=iElem1Index+arrElem1Elements.length; i<this.elements.length; i++) arrMovedElements[arrMovedElements.length] = this.elements[i]; // end of 1st element to end |
| 284 |
this.elements = arrMovedElements; |
| 285 |
} |
| 286 |
for (var i=0; i<this.elements.length; i++) this.elements[i].index = i; |
| 287 |
} |
| 288 |
|
| 289 |
|
| 290 |
function JSXMLBuilder_generateXML(bXMLTag) { |
| 291 |
var strXML = ""; |
| 292 |
var arrXML = []; |
| 293 |
if (bXMLTag) strXML += '<?xml version="1.0"?>\n\n'; |
| 294 |
for (var i=0; i<this.elements.length; i++) { |
| 295 |
strXML += RepeatChar("\t",this.elements[i].level-1); |
| 296 |
strXML += "<" + this.element(i).name; // open tag |
| 297 |
if (this.element(i).attributes) { |
| 298 |
for (var j=0; j<this.element(i).attributes.length; j++) { // set attributes |
| 299 |
if (this.element(i).attributes[j]) { |
| 300 |
strXML += ' ' + this.element(i).attributes[j][0] + '="' + this.element(i).attributes[j][1] + '"'; |
| 301 |
} |
| 302 |
} |
| 303 |
} else strXML += this.element(i).attributeString.replace(/[\/>]$/gi, ""); |
| 304 |
if (((this.elements[i+1] && this.elements[i+1].level <= this.elements[i].level) || // next element is a lower or equal to |
| 305 |
(!this.elements[i+1] && this.elements[i-1])) // no next element, previous element |
| 306 |
&& this.element(i).text === "") { |
| 307 |
strXML += "/"; |
| 308 |
} |
| 309 |
strXML += ">"; |
| 310 |
if (this.element(i).text !== "") strXML += this.element(i).text; |
| 311 |
else strXML += "\n"; |
| 312 |
if (((this.elements[i+1] && this.elements[i+1].level <= this.elements[i].level) || // next element is a lower or equal to |
| 313 |
(!this.elements[i+1] && this.elements[i-1])) // no next element, previous element |
| 314 |
&& this.element(i).text !== "") strXML += "</" + this.element(i).name + ">\n"; |
| 315 |
if (!this.elements[i+1]) { |
| 316 |
var lastelem = i; |
| 317 |
for (var j=i; j>-1; j--) { |
| 318 |
if (this.elements[j].level >= this.elements[i].level) continue; |
| 319 |
else { |
| 320 |
if (this.elements[j].level < this.elements[lastelem].level) { |
| 321 |
strXML += RepeatChar("\t",this.elements[j].level-1) + "</" + this.element(j).name + ">\n"; |
| 322 |
lastelem = j; |
| 323 |
} |
| 324 |
} |
| 325 |
} |
| 326 |
} else { |
| 327 |
if (this.elements[i+1].level < this.elements[i].level) { |
| 328 |
var lastelem = i; |
| 329 |
for (var j=i; this.elements[j].level>=this.elements[i+1].level; j--) { |
| 330 |
if (this.elements[i] && this.elements[j] && this.elements[j].level < this.elements[i].level && this.elements[j].level < this.elements[lastelem].level) { |
| 331 |
strXML += RepeatChar("\t",this.elements[j].level-1) + "</" + this.element(j).name + ">\n"; |
| 332 |
lastelem = j; |
| 333 |
} |
| 334 |
} |
| 335 |
} |
| 336 |
} |
| 337 |
if (strXML.length > 1000) { |
| 338 |
arrXML[arrXML.length] = strXML; |
| 339 |
strXML = ""; |
| 340 |
} |
| 341 |
} |
| 342 |
arrXML[arrXML.length] = strXML; |
| 343 |
return arrXML.join(""); |
| 344 |
} |
| 345 |
|
| 346 |
function JSXMLBuilder_XMLElement(strName,Attributes,strText,iLevel,xmlBuilder) { |
| 347 |
this.type = "element"; |
| 348 |
this.name = strName; |
| 349 |
this.attributes = (typeof(Attributes) != "string") ? Attributes : null; |
| 350 |
this.attributeString = (typeof(Attributes) == "string") ? Attributes : ""; |
| 351 |
this.text = strText; |
| 352 |
this.level = iLevel; |
| 353 |
this.index = -1; |
| 354 |
this.xmlBuilder = xmlBuilder; |
| 355 |
|
| 356 |
this.parseAttributes = JSXMLBuilder_XMLElement_parseAttributes; |
| 357 |
this.attribute = JSXMLBuilder_XMLElement_attribute; |
| 358 |
this.setAttribute = JSXMLBuilder_XMLElement_setAttribute; |
| 359 |
this.removeAttribute = JSXMLBuilder_XMLElement_removeAttribute; |
| 360 |
this.parentElement = JSXMLBuilder_XMLElement_parentElement; |
| 361 |
this.childElement = JSXMLBuilder_XMLElement_childElement; |
| 362 |
} |
| 363 |
|
| 364 |
function JSXMLBuilder_XMLElement_parseAttributes() { |
| 365 |
if (!this.attributes) { |
| 366 |
var reAttributes = new RegExp(" ([^= ]*)=","g"); // matches attributes |
| 367 |
if (this.attributeString.match(reAttributes) && this.attributeString.match(reAttributes).length) { |
| 368 |
var arrAttributes = this.attributeString.match(reAttributes); |
| 369 |
if (!arrAttributes.length) arrAttributes = null; |
| 370 |
else for (var j=0; j<arrAttributes.length; j++) { |
| 371 |
arrAttributes[j] = new Array( |
| 372 |
(arrAttributes[j]+"").replace(/[= ]/g,""), |
| 373 |
ParseAttribute(this.attributeString, (arrAttributes[j]+"").replace(/[= ]/g,"")) |
| 374 |
); |
| 375 |
} |
| 376 |
this.attributes = arrAttributes; |
| 377 |
} |
| 378 |
} |
| 379 |
} |
| 380 |
|
| 381 |
function JSXMLBuilder_XMLElement_attribute(AttributeName) { |
| 382 |
if (!this.attributes) this.parseAttributes(); |
| 383 |
if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == AttributeName) return this.attributes[i][1]; |
| 384 |
return ""; |
| 385 |
} |
| 386 |
|
| 387 |
function JSXMLBuilder_XMLElement_setAttribute(AttributeName,Value) { |
| 388 |
if (!this.attributes) this.parseAttributes(); |
| 389 |
if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == AttributeName) { |
| 390 |
this.attributes[i][1] = Value; |
| 391 |
return; |
| 392 |
} |
| 393 |
this.attributes[this.attributes.length] = new Array(AttributeName,Value); |
| 394 |
} |
| 395 |
|
| 396 |
function JSXMLBuilder_XMLElement_removeAttribute(AttributeName,Value) { |
| 397 |
if (!this.attributes) this.parseAttributes(); |
| 398 |
if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == AttributeName) { |
| 399 |
this.attributes = this.attributes.remove(i); |
| 400 |
return; |
| 401 |
} |
| 402 |
} |
| 403 |
|
| 404 |
function JSXMLBuilder_XMLElement_parentElement() { |
| 405 |
for (var i=this.index; this.xmlBuilder.element(i) && this.xmlBuilder.element(i).level != this.level-1; i--); |
| 406 |
return this.xmlBuilder.element(i); |
| 407 |
} |
| 408 |
|
| 409 |
function JSXMLBuilder_XMLElement_childElement(Child) { |
| 410 |
var iFind = -1; |
| 411 |
for (var i=this.index+1; i<this.xmlBuilder.elements.length; i++) { |
| 412 |
if (this.xmlBuilder.elements[i].level == this.level+1) { |
| 413 |
iFind++; |
| 414 |
if (iFind == Child || this.xmlBuilder.elements[i].name == Child) return this.xmlBuilder.elements[i]; |
| 415 |
} else if (this.xmlBuilder.elements[i].level <= this.level) break; |
| 416 |
} |
| 417 |
return null; |
| 418 |
} |
| 419 |
|
| 420 |
|
| 421 |
function JSXMLIterator(xmleElem) { |
| 422 |
this.xmleElem = xmleElem; |
| 423 |
|
| 424 |
this.iElemIndex = 0; |
| 425 |
this.arrElemIndex = new Array(0); |
| 426 |
this.iElemLevel = 0; |
| 427 |
this.iElem = 0; |
| 428 |
this.arrElemIndex[this.iElemLevel] = -1; |
| 429 |
|
| 430 |
this.getNextNode = JSXMLIterator_getNextNode; |
| 431 |
} |
| 432 |
|
| 433 |
function JSXMLIterator_getNextNode() { |
| 434 |
if (!this.xmleElem || this.iElemLevel<0) return false; |
| 435 |
if (this.xmleElem.childElements.length) { // move up |
| 436 |
this.arrElemIndex[this.iElemLevel]++; |
| 437 |
this.iElemIndex++; |
| 438 |
this.iElemLevel++; |
| 439 |
this.arrElemIndex[this.iElemLevel] = 0; |
| 440 |
this.xmleElem = this.xmleElem.childElements[0]; |
| 441 |
} else { // move next |
| 442 |
this.iElemIndex++; |
| 443 |
this.arrElemIndex[this.iElemLevel]++; |
| 444 |
if (this.xmleElem.parentElement && this.xmleElem.parentElement.childElements.length && this.arrElemIndex[this.iElemLevel] < this.xmleElem.parentElement.childElements.length) this.xmleElem = this.xmleElem.parentElement.childElements[this.arrElemIndex[this.iElemLevel]]; |
| 445 |
else { |
| 446 |
if (this.iElemLevel>0) { // move down |
| 447 |
for (; this.iElemLevel > 0; this.iElemLevel--) { |
| 448 |
if (this.xmleElem.parentElement && this.xmleElem.parentElement.childElements[this.arrElemIndex[this.iElemLevel]]) { |
| 449 |
this.xmleElem = this.xmleElem.parentElement.childElements[this.arrElemIndex[this.iElemLevel]]; |
| 450 |
this.iElemLevel++; |
| 451 |
this.arrElemIndex = this.arrElemIndex.slice(0,this.iElemLevel+1); |
| 452 |
break; |
| 453 |
} else { |
| 454 |
this.xmleElem = this.xmleElem.parentElement; |
| 455 |
} |
| 456 |
} |
| 457 |
this.iElemLevel--; |
| 458 |
} else { |
| 459 |
return false; |
| 460 |
} |
| 461 |
} |
| 462 |
} |
| 463 |
return (typeof(this.xmleElem) == "object" && this.iElemLevel > -1); |
| 464 |
} |
| 465 |
|
| 466 |
function ParseAttribute(str,Attribute) { |
| 467 |
var str = str + ">"; |
| 468 |
if (str.indexOf(Attribute + "='")>-1) var Attr = new RegExp(".*" + Attribute + "='([^']*)'.*>"); |
| 469 |
else if (str.indexOf(Attribute + '="')>-1) var Attr = new RegExp(".*" + Attribute + '="([^"]*)".*>'); |
| 470 |
return str.replace(Attr, "$1"); |
| 471 |
} |
| 472 |
|
| 473 |
function Array_Remove(c) { |
| 474 |
var tmparr = []; |
| 475 |
for (var i=0; i<this.length; i++) if (i!=c) tmparr[tmparr.length] = this[i]; |
| 476 |
return tmparr; |
| 477 |
} |
| 478 |
|
| 479 |
function Array_Add(c, cont) { |
| 480 |
if (c == this.length) { |
| 481 |
this[this.length] = cont; |
| 482 |
return this; |
| 483 |
} |
| 484 |
var tmparr = []; |
| 485 |
for (var i=0; i<this.length; i++) { |
| 486 |
if (i==c) tmparr[tmparr.length] = cont; |
| 487 |
tmparr[tmparr.length] = this[i]; |
| 488 |
} |
| 489 |
if (!tmparr[c]) tmparr[c] = cont; |
| 490 |
return tmparr; |
| 491 |
} |
| 492 |
|
| 493 |
function RepeatChar(sChar,iNum) { |
| 494 |
var L = ""; |
| 495 |
for (var i=0; i<iNum; i++) L += sChar; |
| 496 |
return L; |
| 497 |
} |