var XmlChart = function(config) {
/* 傳入的config必須要有url或xmlStr */
if (!config.url && !config.xmlStr) {
return null;
}
/* 要返回的對像 */
var xmlChartObj = {
/* 判斷是否是IE */
_isIe: navigator.appName == "Microsoft Internet Explorer" ? true: false,
/* 對象創(chuàng)建時初始化的函數(shù) */
init: function() {
/* 統(tǒng)一瀏覽器間selectNodes和selectSingleNode方法 */
if (!this._isIe) {
var ex;
XMLDocument.prototype.__proto__.__defineGetter__("xml",
function() {
try {
return new XMLSerializer().serializeToString(this);
} catch(ex) {
var d = document.createElement("div");
d.appendChild(this.cloneNode(true));
return d.innerHTML;
}
});
Element.prototype.__proto__.__defineGetter__("xml",
function() {
try {
return new XMLSerializer().serializeToString(this);
} catch(ex) {
var d = document.createElement("div");
d.appendChild(this.cloneNode(true));
return d.innerHTML;
}
});
XMLDocument.prototype.__proto__.__defineGetter__("text",
function() {
return this.firstChild.textContent;
});
Element.prototype.__proto__.__defineGetter__("text",
function() {
return this.textContent;
});
XMLDocument.prototype.selectSingleNode = Element.prototype.selectSingleNode = function(XPath) {
var x = this.selectNodes(xpath);
if (!x || x.length < 1) return null;
return x[0];
}
XMLDocument.prototype.selectNodes = Element.prototype.selectNodes = function(xpath) {
var xpe = new XPathEvaluator();
var nsResolver = xpe.createNSResolver(this.ownerDocument == null ? this.documentElement: this.ownerDocument.documentElement);
var result = xpe.evaluate(xpath, this, nsResolver, 0, null);
var found = [];
var res;
while (res = result.iterateNext()) found.push(res);
return found;
}
Node.prototype.transformNode = function(oXslDom) {
var oProcessor = new XSLTProcessor();
oProcessor.importStylesheet(oXslDom);
var oResultDom = oProcessor.transformToDocument(this);
var sResult = oResultDom.xml;
if (sResult.indexOf(" <transformiix:result") > -1) {
sResult = sResult.substring(sResult.indexOf("> ") + 1, sResult.lastIndexOf(" <"));
}
return sResult;
};
}
/* 將用戶定義參數(shù)傳賦給對象 */
for (var prop in config) {
eval('this.' + prop + ' = "' + config[prop] + '";');
}
/* 加載XML */
this.parseXML();
},
/* 加載XML */
parseXML: function() {
var xmlDoc;
if (this._isIe) {
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
//關(guān)閉異步加載,這樣確保在文檔完全加載之前解析器不會繼續(xù)腳本的執(zhí)行。
/* 根據(jù)文件路徑或傳入字符串加載XML */
if (this.url) {
xmlDoc.load(this.url)
} else if (this.xmlStr) {
xmlDoc.loadXML(this.xmlStr);
}
} else {
try //Firefox, Mozilla, Opera, etc.
{
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.async = false; //關(guān)閉異步加載,這樣確保在文檔完全加載之前解析器不會繼續(xù)腳本的執(zhí)行。
/* 根據(jù)文件路徑或傳入字符串加載XML */
if (this.url) {
xmlDoc.load(this.url)
} else if (this.xmlStr) {
xmlDoc = (new DOMParser()).parseFromString(this.xmlStr, "text/xml");
}
} catch(e) {
alert("加載文件出錯:\n" + e.message);
return;
}
}
/* 將加載的XML對象賦給元素的el屬性 */
this.el = xmlDoc;
//this.originalEl = o;
},
/// <summary>根據(jù)xpath取符合條件的節(jié)點集合</summary>
/// <param name="domDoc">xml對象</param>
/// <param name="xpath">xpath語句</param>
/// <returns>返回符合條件的節(jié)點集合</returns>
selectNodes: function(xpath) {
if (this._isIe) {
return this.el.selectNodes(xpath);
} else {
var aNodeArray = new Array();
var xPathResult = this.el.evaluate(xpath, this.el, this.el.createNSResolver(this.el.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
if (xPathResult) {
var oNode = xPathResult.iterateNext();
while (oNode) {
aNodeArray[aNodeArray.length] = oNode;
oNode = xPathResult.iterateNext();
}
}
return aNodeArray;
}
},
selectSingleNode: function(xpath) {
if (this._isIe) {
l(this.el.selectSingleNode(xpath));
return this.el.selectSingleNode(xpath);
} else {
var aNodeArray = new Array();
var xPathResult = this.el.evaluate(xpath, this.el, this.el.createNSResolver(this.el.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
if (xPathResult) {
var oNode = xPathResult.iterateNext();
while (oNode) {
aNodeArray[aNodeArray.length] = oNode;
oNode = xPathResult.iterateNext();
}
}
return aNodeArray[0];
}
},
/* 創(chuàng)建節(jié)點,parent為父節(jié)點的對象或xpath,node為子節(jié)點的對象 */
createNode: function(parent, node) {},
/* 創(chuàng)建節(jié)點,parent為父節(jié)點的對象或xpath,cfg為子節(jié)點的參數(shù) */
createNodeJ: function(parent, cfg) {},
removeNode: function(parent, node) {},
createAttr: function(node, name, value) {},
createAttrJ: function(node, cfg) {},
/* 修改屬性值 */
setAttr: function(node, name, value) {
var node = this.selectSingleNode(node);
if(node){
node.setAttribute(name,value);
}
},
setAttrJ: function(cfg) {},
/*設(shè)置節(jié)點文本值*/
setText: function(node, text) {
if (typeof node == 'string') {
node = this.selectSingleNode(node);
}
node.firstChild.nodeValue = text;
},
/* 返回對象的xml字符串 */
getStr: function() {
/* 得到對象的xml字符串 */
var s = this.el.xml || new XMLSerializer().serializeToString(this.el);
/* 字符串壓縮, */
s = s.replace(/>[\n|\t|\s]*</g, '><');
return s;
},
/* 重新加載xml */
reLoad: function() {
this.parseXML();
},
/** 定義可修改節(jié)點的屬性,
* 可以用來控制不在這個定義里的內(nèi)容不讓修改,
* 還可用來定義節(jié)點xpath,要修改的內(nèi)容是文本還是屬性等
*/
N: {
chartType: {
xpath: 'chart/chart_type',
type: 'value'
}
},
/*替換圖表類型*/
chgChartType: function(s) {
this.setText(this.N.chartType.xpath, s);
},
chgLegend:function(){},
chgChart:function(cfg){
for(var i=0;i<cfg.length;i++){
for(var attrName in cfg[i].attr){
this.setAttr(cfg.nodeName,attrName,cfg[i].attr[attrName]);
}
}
}
}
/*執(zhí)行初始化*/
xmlChartObj.init();
return xmlChartObj;
}
/* 調(diào)試用,輸出元素 */
function l(o) {
if (document.all) {
alert(o);
} else {
console.log(o);
}
}