source: XmlTools2/trunk/libs/rexml.js@ 940

Last change on this file since 940 was 906, checked in by s10k, 11 years ago
File size: 6.6 KB
Line 
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
7function 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
145function 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}
Note: See TracBrowser for help on using the repository browser.