[905] | 1 | ////// JSXML XML Tools - REXML /////////////
|
---|
| 2 | ////// Regular Expression-based XML parser /////////////
|
---|
| 3 | ////// Ver 1.2 Jun 18 2001 /////////////
|
---|
| 4 | ////// Copyright 2000 Peter Tracey /////////////
|
---|
| 5 | ////// http://jsxml.homestead.com/ /////////////
|
---|
| 6 |
|
---|
| 7 | function REXML(XML) {
|
---|
| 8 | this.XML = XML;
|
---|
| 9 |
|
---|
| 10 | this.rootElement = null;
|
---|
| 11 |
|
---|
| 12 | this.parse = REXML_parse;
|
---|
| 13 | if (this.XML && this.XML != "") this.parse();
|
---|
| 14 | }
|
---|
| 15 |
|
---|
| 16 | function REXML_parse() {
|
---|
| 17 | var reTag = new RegExp("<([^>/ ]*)([^>]*)>","g"); // matches that tag name $1 and attribute string $2
|
---|
| 18 | var reTagText = new RegExp("<([^>/ ]*)([^>]*)>([^<]*)","g"); // matches tag name $1, attribute string $2, and text $3
|
---|
| 19 | var strType = "";
|
---|
| 20 | var strTag = "";
|
---|
| 21 | var strText = "";
|
---|
| 22 | var strAttributes = "";
|
---|
| 23 | var strOpen = "";
|
---|
| 24 | var strClose = "";
|
---|
| 25 | var iElements = 0;
|
---|
| 26 | var xmleLastElement = null;
|
---|
| 27 | if (this.XML.length == 0) return;
|
---|
| 28 | var arrElementsUnparsed = this.XML.match(reTag);
|
---|
| 29 | var arrElementsUnparsedText = this.XML.match(reTagText);
|
---|
| 30 | var i=0;
|
---|
| 31 | if (arrElementsUnparsed[0].replace(reTag, "$1") == "?xml") i++;
|
---|
| 32 |
|
---|
| 33 | for (; i<arrElementsUnparsed.length; i++) {
|
---|
| 34 | strTag = arrElementsUnparsed[i].replace(reTag,"$1");
|
---|
| 35 | strAttributes = arrElementsUnparsed[i].replace(reTag,"$2");
|
---|
| 36 | strText = arrElementsUnparsedText[i].replace(reTagText,"$3").replace(/[\r\n\t ]+/g, " "); // remove white space
|
---|
| 37 | strClose = "";
|
---|
| 38 | if (strTag.indexOf("![CDATA[") == 0) {
|
---|
| 39 | strOpen = "<![CDATA[";
|
---|
| 40 | strClose = "]]>";
|
---|
| 41 | strType = "cdata";
|
---|
| 42 | } else if (strTag.indexOf("!--") == 0) {
|
---|
| 43 | strOpen = "<!--";
|
---|
| 44 | strClose = "-->";
|
---|
| 45 | strType = "comment";
|
---|
| 46 | } else if (strTag.indexOf("?") == 0) {
|
---|
| 47 | strOpen = "<?";
|
---|
| 48 | strClose = "?>";
|
---|
| 49 | strType = "pi";
|
---|
| 50 | } else strType = "element";
|
---|
| 51 | if (strClose != "") {
|
---|
| 52 | strText = "";
|
---|
| 53 | if (arrElementsUnparsedText[i].indexOf(strClose) > -1) strText = arrElementsUnparsedText[i];
|
---|
| 54 | else {
|
---|
| 55 | for (; i<arrElementsUnparsed.length && arrElementsUnparsedText[i].indexOf(strClose) == -1; i++) {
|
---|
| 56 | strText += arrElementsUnparsedText[i];
|
---|
| 57 | }
|
---|
| 58 | strText += arrElementsUnparsedText[i];
|
---|
| 59 | }
|
---|
| 60 | if (strText.substring(strOpen.length, strText.indexOf(strClose)) != "") {
|
---|
| 61 | xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, "","",xmleLastElement,strText.substring(strOpen.length, strText.indexOf(strClose)));
|
---|
| 62 | if (strType == "cdata") xmleLastElement.text += strText.substring(strOpen.length, strText.indexOf(strClose));
|
---|
| 63 | }
|
---|
| 64 | if (strText.indexOf(strClose)+ strClose.length < strText.length) {
|
---|
| 65 | xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText.substring(strText.indexOf(strClose)+ strClose.length, strText.length));
|
---|
| 66 | if (strType == "cdata") xmleLastElement.text += strText.substring(strText.indexOf(strClose)+ strClose.length, strText.length);
|
---|
| 67 | }
|
---|
| 68 | continue;
|
---|
| 69 | }
|
---|
| 70 | if (strText.replace(/ */, "") == "") strText = "";
|
---|
| 71 | if (arrElementsUnparsed[i].substring(1,2) != "/") {
|
---|
| 72 | if (iElements == 0) {
|
---|
| 73 | xmleLastElement = this.rootElement = new REXML_XMLElement(strType, strTag,strAttributes,null,strText);
|
---|
| 74 | iElements++;
|
---|
| 75 | if (strText != "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText);
|
---|
| 76 | } else if (arrElementsUnparsed[i].substring(arrElementsUnparsed[i].length-2,arrElementsUnparsed[i].length-1) != "/") {
|
---|
| 77 | xmleLastElement = xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, strTag,strAttributes,xmleLastElement,strText);
|
---|
| 78 | iElements++;
|
---|
| 79 | if (strText != "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText);
|
---|
| 80 | } else {
|
---|
| 81 | xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement(strType, strTag,strAttributes,xmleLastElement,strText);
|
---|
| 82 | if (strText != "") xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText);
|
---|
| 83 | }
|
---|
| 84 | } else {
|
---|
| 85 | xmleLastElement = xmleLastElement.parentElement;
|
---|
| 86 | iElements--;
|
---|
| 87 | if (xmleLastElement && strText != "") {
|
---|
| 88 | xmleLastElement.text += strText;
|
---|
| 89 | xmleLastElement.childElements[xmleLastElement.childElements.length] = new REXML_XMLElement("text", "","",xmleLastElement,strText);
|
---|
| 90 | }
|
---|
| 91 | }
|
---|
| 92 | }
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | function REXML_XMLElement(strType, strName, strAttributes, xmlParent, strText) {
|
---|
| 96 | this.type = strType;
|
---|
| 97 | this.name = strName;
|
---|
| 98 | this.attributeString = strAttributes;
|
---|
| 99 | this.attributes = null;
|
---|
| 100 | this.childElements = new Array();
|
---|
| 101 | this.parentElement = xmlParent;
|
---|
| 102 | this.text = strText; // text of element
|
---|
| 103 |
|
---|
| 104 | this.getText = REXML_XMLElement_getText; // text of element and child elements
|
---|
| 105 | this.childElement = REXML_XMLElement_childElement;
|
---|
| 106 | this.attribute = REXML_XMLElement_attribute;
|
---|
| 107 | }
|
---|
| 108 |
|
---|
| 109 | function REXML_XMLElement_getText() {
|
---|
| 110 | if (this.type == "text" || this.type == "cdata") {
|
---|
| 111 | return this.text;
|
---|
| 112 | } else if (this.childElements.length) {
|
---|
| 113 | var L = "";
|
---|
| 114 | for (var i=0; i<this.childElements.length; i++) {
|
---|
| 115 | L += this.childElements[i].getText();
|
---|
| 116 | }
|
---|
| 117 | return L;
|
---|
| 118 | } else return "";
|
---|
| 119 | }
|
---|
| 120 |
|
---|
| 121 | function REXML_XMLElement_childElement(strElementName) {
|
---|
| 122 | for (var i=0; i<this.childElements.length; i++) if (this.childElements[i].name == strElementName) return this.childElements[i];
|
---|
| 123 | return null;
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | function REXML_XMLElement_attribute(strAttributeName) {
|
---|
| 127 | if (!this.attributes) {
|
---|
| 128 | var reAttributes = new RegExp(" ([^= ]*)=","g"); // matches attributes
|
---|
| 129 | if (this.attributeString.match(reAttributes) && this.attributeString.match(reAttributes).length) {
|
---|
| 130 | var arrAttributes = this.attributeString.match(reAttributes);
|
---|
| 131 | if (!arrAttributes.length) arrAttributes = null;
|
---|
| 132 | else for (var j=0; j<arrAttributes.length; j++) {
|
---|
| 133 | arrAttributes[j] = new Array(
|
---|
| 134 | (arrAttributes[j]+"").replace(/[= ]/g,""),
|
---|
| 135 | ParseAttribute(this.attributeString, (arrAttributes[j]+"").replace(/[= ]/g,""))
|
---|
| 136 | );
|
---|
| 137 | }
|
---|
| 138 | this.attributes = arrAttributes;
|
---|
| 139 | }
|
---|
| 140 | }
|
---|
| 141 | if (this.attributes) for (var i=0; i<this.attributes.length; i++) if (this.attributes[i][0] == strAttributeName) return this.attributes[i][1];
|
---|
| 142 | return "";
|
---|
| 143 | }
|
---|
| 144 |
|
---|
| 145 | function ParseAttribute(str,Attribute) {
|
---|
| 146 | var str = str + ">";
|
---|
| 147 | if (str.indexOf(Attribute + "='")>-1) var Attr = new RegExp(".*" + Attribute + "='([^']*)'.*>");
|
---|
| 148 | else if (str.indexOf(Attribute + '="')>-1) var Attr = new RegExp(".*" + Attribute + '="([^"]*)".*>');
|
---|
| 149 | return str.replace(Attr, "$1");
|
---|
| 150 | }
|
---|