javascript解析xml

IE Firefox ---[color=red]yes[/color] other---[color=red]no[/color]

/*
* 解析XML
*/

var XML = (function() {
var constant = {
hasActiveX: (typeof ActiveXObject != "undefined"),
useXmlHttp: (typeof XMLHttpRequest != "undefined"),
hasXmlDom: (document.implementation && document.implementation.hasFeature("XML", "1.0")),
hasDomLS: (document.implementation && document.implementation.hasFeature("LS", "3.0"))
};

function createXMLHttpRequest() {
if (constant.hasActiveX) {
var version = ["MSXML2.XmlHttp.6.0", "MSXML2.XmlHttp.3.0"];
for (var i = 0; i < version.length; i++) {
try {
var req = new ActiveXObject(version[i]);
return req;
} catch (error) {
}
}
} else if (constant.useXmlHttp) {
return new XMLHttpRequest();
}
throw new Error("XMLHttp object could not be created.");
}

function createDocument() {
if (constant.hasXmlDom) {
var oXmlDom = document.implementation.createDocument("","",null);
oXmlDom.parseError = {
valueOf: function () { return this.errorCode; },
toString: function () { return this.errorCode.toString() }
};
oXmlDom.__initError__();
oXmlDom.addEventListener("load", function () {
this.__checkForErrors__();
this.__changeReadyState__(4);
}, false);
return oXmlDom;
} else if (constant.hasActiveX) {
var aVersions = ["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","Microsoft.XmlDom"];
for (var i = 0; i < aVersions.length; i++) {
try {
var oXmlDom = new ActiveXObject(aVersions[i]);
return oXmlDom;
} catch (oError) {}
}
throw new Error("MSXML is not installed.");
} else {
throw new Error("Your browser doesn't support an XML DOM document.");
}
};//end createDocument

var oDomDocument = null;
if (typeof XMLDocument != "undefined") {
oDomDocument = XMLDocument;
} else if (typeof Document != "undefined") {
oDomDocument = Document;
}

if (oDomDocument) {
oDomDocument.prototype.readyState = 0;
oDomDocument.prototype.onreadystatechange = null;
oDomDocument.prototype.__changeReadyState__ = function (iReadyState) {
this.readyState = iReadyState;
if (typeof this.onreadystatechange == "function") {
this.onreadystatechange();
}
};
oDomDocument.prototype.__initError__ = function () {
this.parseError.errorCode = 0;
this.parseError.filepos = -1;
this.parseError.line = -1;
this.parseError.linepos = -1;
this.parseError.reason = null;
this.parseError.srcText = null;
this.parseError.url = null;
};
//function load the DOM of another document
oDomDocument.prototype.__loadDom__ = function (oXmlDom) {
while (this.firstChild) {
this.removeChild(this.firstChild);
}
for (var i=0; i < oXmlDom.childNodes.length; i++) {
var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
this.appendChild(oNewNode);
}
};
try {
if (typeof oDomDocument.prototype.async != "boolean") {
oDomDocument.prototype.async = true;
}
} catch (e) {}

oDomDocument.prototype.load = function (sURL) {
this.__initError__();
var oHttp = createXMLHttpRequest();
var oDom = this;
oHttp.open("get", sURL, this.async);
if (this.async) {
oHttp.onreadystatechange = function () {
if (oHttp.readyState == 4) {
oHttp.onreadystatechange = null;
oDom.__loadDom__(oHttp.responseXML);
oDom.__checkForErrors__();
}
oDom.__changeReadyState__(oHttp.readyState);
};
}
oHttp.send(null);
if (!this.async) oDom.__loadDom__(oHttp.responseXML);
};
if (constant.hasDomLS) {
oDomDocument.prototype.__checkForErrors__ = function (oError) {
if (!oError) return;
this.parseError.errorCode = -999999;
this.parseError.reason = oError.message;
this.parseError.url = oError.location.uri;
this.parseError.line = oError.location.lineNumber;
this.parseError.linepos = oError.location.columnNumber;
this.parseError.srcText = (oError.location.relatedNode)?"Around " + oError.location.relatedNode.nodeName:oError.type;
};
} else {
if (!window.opera) {
oDomDocument.prototype.__checkForErrors__ = function (oEx) {
if (this.documentElement.tagName == "parsererror") {
var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
reError.test(this.xml);
this.parseError.errorCode = -999999;
this.parseError.reason = RegExp.$1;
this.parseError.url = RegExp.$2;
this.parseError.line = parseInt(RegExp.$3);
this.parseError.linepos = parseInt(RegExp.$4);
this.parseError.srcText = RegExp.$5;
}
};
}
}
}

//public method
return {
isSupported: function() {
return constant.hasActiveX || constant.hasXmlDom;
},

read: function(sURL, fnCallback) {
if(this.isSupported()) {
var oXmlDom = createDocument();
oXmlDom.onreadystatechange = function() {
if (oXmlDom.readyState == 4) {
if(oXmlDom.parseError.errorCode == 0) {
fnCallback(oXmlDom, oXmlDom.documentElement);
}else {
alert("error");
}
}
}
oXmlDom.async = true;
oXmlDom.validateOnParse = false;
oXmlDom.load(sURL);
}else {
throw new Error("Your browser doesn't support an XML DOM object.");
}
},

getNode: function(node) {
if (node.nodeType == 1) {
return node;
} else {
var n = node.nextSibling;
while (n.nodeType != 1 && n.nextSibling != null) {
n = n.nextSibling;
}
return (n.nodeType == 1) ? n : false;
}
},

hasChildren: function() {
return this.getChildNodesLength(node) > 0;
},

getChildNodesLength: function(parentNode) {
var oNodes = parentNode.childNodes;
var n = 0;
for (var i = 0, len = oNodes.length; i < len; i++) if (oNodes[i].nodeType == 1) n++;
return n;
},

//读取节点文本值
getText: function(node) {
return node.firstChild.nodeValue;
}
}
})();


[b][size=medium]测试XML:[/size][/b]
=============================

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
<script type="text/javascript" src="XML.min.js"></script>
</head>
<body>
<div id="result"></div>
<script type="text/javascript">
XML.read("country.xml", function(oXmlDom, root) {
parseInfo(root);
print();
});

function parseInfo(root) {
for (var i = 0; i < root.childNodes.length; i++) {
if (root.childNodes[i].nodeType == 1) {
var node = root.childNodes.item(i);
var id = node.getAttribute("id");
var pid = node.getAttribute("pid");
var value = XML.getText(node);
addNode(id, pid, value);
if (node.hasChildNodes()) {
parseInfo(node);
}
}
}
}

var list = new Array();
function addNode(id, pid, value) {
list[list.length] = new Node(id, pid, value);
}

function Node(id, pid, value) {
this.id = id;
this.pid = pid;
this.value = value;
}

function print() {
var tmp = [];
for (var i = 0; i < list.length; i++) {
var node = list[i];
tmp[tmp.length] = "[id=" + node.id + " pid=" + node.pid + " value=" + node.value + "] ";
}
document.getElementById("result").innerHTML = tmp.join("");
}
</script>
</body>
</html>


[size=medium][b]输出结果:[/b][/size]
=============================
[id=1 pid=0 value=中国]
[id=2 pid=1 value=北京]
[id=3 pid=1 value=上海]
[id=4 pid=1 value=辽宁]
[id=5 pid=4 value=沈阳]
[id=6 pid=4 value=大连]
[id=7 pid=4 value=鞍山]
[id=8 pid=1 value=天津]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值