📄 xmldom.jsc
字号:
# language: JSVM2
/**
* @fileoverview js.net.XmlDom class {@link http://jsvm.org/}
* @file XmlDom.jsc
* @author DSONET, Wan Changhua * @version 2.01, 10/23/05 * @since JSVM2.0
*/
package js.net;
import js.lang.NotSupportException;
import js.lang.System;
import js.net.XmlHttp;
//import js.dom.EventManager;
/** * Create a new XmlDom instance.
* Inherit from JObject
* @author DSONET, Wan Changhua * @version 2.01, 10/23/05 * @extends JObject * @class This is the xmldom utility class.
* @constructor
* @throws NotSupportException if current browser does not support XMLDOM/document.implementation.createDocument(). * @return a <code>Document</code> by document.implementation.createDocument() if the current browser is moz. * a <code>Microsoft.XMLDOM</code> instance otherwise.
*/
class XmlDom ()
{
var __self = this, doc = null;
if (!isIE)
{
doc = document.implementation.createDocument("", "", null);
doc.addEventListener("load", function () {
fireLoadEvent(__self);
}, false);
}
else
{
if (progId != null)
{
doc = new ActiveXObject(progId);
}
var l = progIds.length;
for (var i = 0; i < l; i++)
{
try
{
doc = new ActiveXObject(progIds[i]);
progId = progIds[i];
break;
}
catch (ex) { }
}
if (i == l)
{
throw new NotSupportException(
"Cannot create XmlDom object under '"
+ System.getPlatform() + "'!");
}
doc.onreadystatechange = function ()
{
if (doc.readyState == 4)
{
fireLoadEvent(__self);
}
}
}
this.__doc = doc;
this.__async = false;
syncProperties(this);
this.nodeName = "#document";
this.namespaceURI = "";
this.prefix = "";
this.nodeType = 9;
this.state = 0;
this.onload = null;
this.destroy = function ()
{
for (var p in this)
{
delete this[p];
}
doc = null;
this.__doc = null;
}
}
var isIE = System.isIeBrowser();
var isMoz = System.isMozBrowser();
var isOpera = System.isOperaBrowser();
/** * Retrieves a new XmlDom instance. * @returns a <code>Microsoft.XMLDOM</code> instance if the current browser is ie5. * a <code>XmlDom</code> instance otherwise. * @type XmlHttp */
XmlDom.create = function ()
{
return new XmlDom();
}
/**
* @private
*/
var progIds = ["MSXML2.DOMDocument", "Microsoft.XMLDOM", "MSXML.DOMDocument", "MSXML3.DOMDocument"];
/**
* @private
*/
var progId = null;
var properties = ["async","nodeValue","parentNode","childNodes","firstChild","lastChild","previousSibling","nextSibling","attributes","ownerDocument","doctype","implementation","documentElement"];
var syncProperties = function (o)
{
var doc = o.__doc;
var l = properties.length;
for (var i = 0; i < l; i++)
{
var name = properties[i];
eval("o." + name + "=doc." + name);
}
}
var fireLoadEvent = function (o)
{
this.state = 4;
syncProperties(o);
var func = o.onload;
if ("function" == typeof(func))
{
func();
}
}
/**
* define proxy method
* @prviate
*/
var $p = XmlDom.prototype;
$p.insertBefore = function (newElement, targetElement)
{
return this.__doc.insertBefore(newElement, targetElement);
};
$p.replaceChild = function (newChild, oldChild)
{
return this.__doc.replaceChild(newChild, oldChild);
};
$p.removeChild = function (child)
{
return this.__doc.removeChild(child);
};
$p.appendChild = function (child)
{
return this.__doc.appendChild(child);
};
$p.cloneNode = function (deep)
{
return this.__doc.cloneNode(deep);
};
$p.createElement = function (tagName)
{
return this.__doc.createElement(tagName);
};
$p.createDocumentFragment = function ()
{
return this.__doc.createDocumentFragment();
};
$p.createTextNode = function (data)
{
return this.__doc.createTextNode(data);
};
$p.createComment = function (data)
{
return this.__doc.createComment(data);
};
$p.createCDATASection = function (data)
{
return this.__doc.createCDATASection(data);
};
$p.createProcessingInstruction = function (target, data)
{
return this.__doc.createProcessingInstruction(target, data);
};
$p.createAttribute = function (name)
{
return this.__doc.createAttribute(name);
};
$p.getElementsByTagName = function (name)
{
return this.__doc.getElementsByTagName(name);
};
$p.getDomDocument = function ()
{
return this.__doc;
};
$p.getDocumentElement = function ()
{
return this.__doc.documentElement;
};
$p.setAsync = function (b)
{
this.__async = b;
this.__doc.async = b;
};
$p.getAsync = function (b)
{
return this.__async;
};
$p.selectNodes = function (s)
{
return this.__doc.selectNodes(s);
};
$p.selectSingleNode = function (s)
{
return this.__doc.selectSingleNode(s);
};
$p.hasChildNodes = isOpera ? function () {
return (this.__doc.childNodes.length > 0);
} : function () {
return this.__doc.hasChildNodes();
};
$p.getXML = isIE ? function () {
return this.__doc.xml;
} : function () {
return (isOpera ? "<?xml version=\"1.0\"?>" : "")
+ (new XMLSerializer()).serializeToString(this.__doc);
};
$p.load = isOpera ? function (url) {
try
{
this.state = 0;
this.__doc = document.implementation.createDocument("", "", null);
syncProperties(this);
var async = this.getAsync();
var http = XmlHttp.create();
if (async)
{
var _this = this;
http.onreadystatechange = function ()
{
if (http.readyState == 4)
{
_this.__doc = http.responseXML;
fireLoadEvent(_this);
}
}
}
http.open("GET", url, async);
http.send(null);
if (!async)
{
this.__doc = http.responseXML;
return (this.__doc.documentElement != null);
}
}
catch (ex)
{
if (!async)
{
return false;
}
}
finally
{
if (!async)
{
fireLoadEvent(this);
}
}
} : function (url) {
this.state = 0;
return this.__doc.load(url);
};
$p.loadXML = isIE ? function (s) {
return this.__doc.loadXML(s);
} : function (s) {
try
{
// remove all initial children
//while (this.hasChildNodes())
// while (this.hasChildNodes())
// {
// this.doucment.removeChild(this.doucment.lastChild);
// }
// parse the string to a new doc
this.state = 0;
this.__doc = (new DOMParser()).parseFromString(s, "text/xml");
this.__doc.async = this.__async;
// check parsererror, (for firefox)
//if (/^<parsererror/.test(
// (new XMLSerializer()).serializeToString(this.__doc)))
if (this.__async)
{
return;
}
return (this.__doc.documentElement != null) && (
this.__doc.documentElement.localName != "parsererror" ||
this.__doc.documentElement.getAttribute("xmlns") !=
"http://www.mozilla.org/newlayout/xml/parsererror.xml");
// insert and import nodes
// for (var i = 0; i < doc2.childNodes.length; i++)
// {
// this.__doc.appendChild(
// this.__doc.importNode(doc2.childNodes[i], true));
// }
}
catch (ex)
{
return false;
}
finally
{
fireLoadEvent(this);
}
};
$p.createNode = isIE ? function (stype, name, ns) {
return this.__doc.createNode(stype, name, ns);
} : function (stype, name, ns) {
var doc = this.__doc;
switch (stype)
{
case 1 :
return (ns == null || ns == "") ? doc.createElement(name)
: doc.createElementNS(ns, name);
case 2 :
return (ns == null || ns == "") ? doc.createAttribute(name)
: doc.createAttributeNS(ns, name);
case 3 :
default :
return doc.createTextNode("");
}
};
/*
* extend Node,Text,Attr method
*/
if (isMoz)
{
/**
* @ignore
*/
Node.prototype.selectNodes = function (sExpr)
{
var doc = (this.nodeType == 9) ? this : this.ownerDocument;
//alert(doc.createNSResolver);
var nsRes = doc.createNSResolver(this.nodeType == 9 ? this.documentElement : this);
var xpRes = doc.evaluate(sExpr, this, nsRes, 5, null);
var res = [];
var item;
while (item = xpRes.iterateNext())
{
res[res.length] = item;
}
return res;
}
/**
* @ignore
*/
Node.prototype.selectSingleNode = function (sExpr)
{
var doc = (this.nodeType == 9) ? this : this.ownerDocument;
var nsRes = doc.createNSResolver((this.nodeType == 9) ? this.documentElement : this);
var xpRes = doc.evaluate(sExpr, this, nsRes, 9, null);
return xpRes.singleNodeValue;
}
}
if (isOpera)
{
/**
* @ignore
*/
var __re_0001 = /^\/([^\/])/;
var __re_0002 = /^\/\/([^\/])/;
//TODO for: /nodename[@attr="value"] var __re_0003 = /()(\[@(.)+\])+/;
var __getChildNodes = function (oNode, sExpr, bRec)
{
if (sExpr == "")
{
return [];
}
var idx = sExpr.indexOf("/");
var sPre = (idx == -1) ? sExpr : sExpr.substring(0, idx);
var sSub = (idx == -1) ? null : sExpr.substring(idx + 1);
var isAll = (sPre == "*");
var isFin = (sSub == null);
var nodes = oNode.childNodes;
var l = nodes.length;
var a = [];
for (var i = 0, j = 0; i < l; i++)
{
var node = nodes[i];
if (node.nodeType != 1)
{
continue;
}
if (isAll || node.nodeName == sPre)
{
a = a.concat(isFin ? node : __getChildNodes(node, sSub));
}
if (bRec)
{
a = a.concat(__getChildNodes(node, sExpr, bRec));
}
}
return a;
}
Node.prototype.selectNodes = function (sExpr)
{
if (sExpr == "" || sExpr == null)
{
return [];
}
if (sExpr == "/")
{
return [this.ownerDocument];
}
if (__re_0001.test(sExpr))
{
return __getChildNodes((this.nodeType == 9) ?
this : this.ownerDocument, sExpr.substring(1), false);
}
if (__re_0002.test(sExpr))
{
return __getChildNodes((this.nodeType == 9) ?
this : this.ownerDocument, sExpr.substring(2), true);
}
return __getChildNodes(this,
sExpr, false);
}
/**
* @ignore
*/
Node.prototype.selectSingleNode = function (sExpr)
{
var nodes = this.selectNodes(sExpr);
return (nodes.length > 0) ? nodes[0] : null;
}
}
/**
* public static property
* XmlDom utility object
*/
XmlDom.prototype.utility =
XmlDom.utility = new function ()
{
// parse xml from node
this.getXML = isIE ? function (o) {
return o.xml;
} : function (o) {
return (new XMLSerializer()).serializeToString(o);
};
// parse text from node
this.getText = isIE ? function (o) {
return o.text;
} : function (o) {
if (o instanceof Text)
{
return o.nodeValue;
}
else
{
var cs = o.childNodes;
var l = cs.length;
var sb = new Array(l);
for (var i = 0; i < l; i++)
{
sb[i] = this.getText(cs[i]);
}
return sb.join("");
}
};
// parse base name from node
this.getBaseName = isIE ? function (o) {
return o.nodeName;
} : function (o) {
var lParts = o.nodeName.split(":");
return lParts[lParts.length - 1];
};
// parse base name from node
this.parseNode = function (s)
{
var doc = new XmlDom();
doc.setAsync(false);
doc.loadXML(s);
var node = doc.documentElement;
doc.destroy();
return node;
};
this.selectNodes = function (o, s)
{
return o.selectNodes(s);
};
this.selectSingleNode = function (o, s)
{
return o.selectSingleNode(s);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -