通过JS解析XML字符串
IE跟FireFox都有一个onload()方法来加载XML文件,而加载XML字符串时,IE下有onloadXML()方法,FireFox下并没有此方法,所以FireFox下要将XML字符串解析成DOM对象,必须使用DOMParser对象
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script type='text/javascript'>
loadXML = function(xmlString){
var xmlDoc=null;
//判断浏览器的类型
//支持IE浏览器
if(!window.DOMParser && window.ActiveXObject){ //window.DOMParser 判断是否是非ie浏览器
var xmlDomVersions = ['MSXML.2.DOMDocument.6.0','MSXML.2.DOMDocument.3.0','Microsoft.XMLDOM'];
for(var i=0;i<xmlDomVersions.length;i++){
try{
xmlDoc = new ActiveXObject(xmlDomVersions[i]);
xmlDoc.async = false;
xmlDoc.loadXML(xmlString); //loadXML方法载入xml字符串
break;
}catch(e){
}
}
}
//支持Mozilla浏览器
else if(window.DOMParser && document.implementation && document.implementation.createDocument){
try{
/* DOMParser 对象解析 XML 文本并返回一个 XML Document 对象。
* 要使用 DOMParser,使用不带参数的构造函数来实例化它,然后调用其 parseFromString() 方法
* parseFromString(text, contentType) 参数text:要解析的 XML 标记 参数contentType文本的内容类型
* 可能是 "text/xml" 、"application/xml" 或 "application/xhtml+xml" 中的一个。注意,不支持 "text/html"。
*/
domParser = new DOMParser();
xmlDoc = domParser.parseFromString(xmlString, 'text/xml');
}catch(e){
}
}
else{
return null;
}
return xmlDoc;
}
//对xml对象进行判断
checkXMLDocObj = function(xmlString){
var xmlDoc = loadXML(xmlString);
if(xmlDoc==null){
alert('您的浏览器不支持xml文件读取,于是本页面禁止您的操作,推荐使用IE5.0以上可以解决此问题!');
//window.location.href='某某地址(比如首页)';
}
return xmlDoc;
}
//参数1:控件id号,参数2:理解为定位节点
initializeSelect = function(oid,xPath){
var xmlstr="<?xml version=\"1.0\" encoding=\"utf-8\"?><DongFang><Company><cNname>1</cNname><cIP>1</cIP></Company><Company><cNname>2</cNname><cIP>2</cIP></Company><Company><cNname>3</cNname><cIP>3</cIP></Company><Company><cNname>4</cNname><cIP>4</cIP></Company><Company><cNname>5</cNname><cIP>5</cIP></Company> <Company><cNname>6</cNname><cIP>6</cIP></Company></DongFang>";
var xmlDoc = checkXMLDocObj(xmlstr);
var n;
var l;
var e = document.getElementById(oid);//得到下拉列表框控件
if(e!=null){
n = xmlDoc.getElementsByTagName(xPath);
l = n.length;
//循环添加列表子项
for(var i=0;i<l;i++){
e.options.add(new Option(n[i].getElementsByTagName("cNname")[0].firstChild.nodeValue, n[i].getElementsByTagName("cIP")[0].firstChild.nodeValue));
}
}
}
</script>
</HEAD>
<BODY onload="initializeSelect('company','Company')">
<select id='company' name='company' onChange='showValue()'>
<option selected='selected'></option>
</select>
</BODY>
</HTML>
domParser = new DOMParser();
xmlDoc = domParser.parseFromString(xmlString, 'text/xml');
xmlDoc = domParser.parseFromString(xmlString, 'text/xml');
解释下两个参数:第一个是xml字符串内容,第二个是要解析的XML标记参数contentType文本的内容类型
下面做了一个小例题来加以说明
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script type='text/javascript'>
loadXML = function(xmlString){
var xmlDoc=null;
//判断浏览器的类型
//支持IE浏览器
if(!window.DOMParser && window.ActiveXObject){ //window.DOMParser 判断是否是非ie浏览器
var xmlDomVersions = ['MSXML.2.DOMDocument.6.0','MSXML.2.DOMDocument.3.0','Microsoft.XMLDOM'];
for(var i=0;i<xmlDomVersions.length;i++){
try{
xmlDoc = new ActiveXObject(xmlDomVersions[i]);
xmlDoc.async = false;
xmlDoc.loadXML(xmlString); //loadXML方法载入xml字符串
break;
}catch(e){
}
}
}
//支持Mozilla浏览器
else if(window.DOMParser && document.implementation && document.implementation.createDocument){
try{
/* DOMParser 对象解析 XML 文本并返回一个 XML Document 对象。
* 要使用 DOMParser,使用不带参数的构造函数来实例化它,然后调用其 parseFromString() 方法
* parseFromString(text, contentType) 参数text:要解析的 XML 标记 参数contentType文本的内容类型
* 可能是 "text/xml" 、"application/xml" 或 "application/xhtml+xml" 中的一个。注意,不支持 "text/html"。
*/
domParser = new DOMParser();
xmlDoc = domParser.parseFromString(xmlString, 'text/xml');
}catch(e){
}
}
else{
return null;
}
return xmlDoc;
}
//对xml对象进行判断
checkXMLDocObj = function(xmlString){
var xmlDoc = loadXML(xmlString);
if(xmlDoc==null){
alert('您的浏览器不支持xml文件读取,于是本页面禁止您的操作,推荐使用IE5.0以上可以解决此问题!');
//window.location.href='某某地址(比如首页)';
}
return xmlDoc;
}
//参数1:控件id号,参数2:理解为定位节点
initializeSelect = function(oid,xPath){
var xmlstr="<?xml version=\"1.0\" encoding=\"utf-8\"?><DongFang><Company><cNname>1</cNname><cIP>1</cIP></Company><Company><cNname>2</cNname><cIP>2</cIP></Company><Company><cNname>3</cNname><cIP>3</cIP></Company><Company><cNname>4</cNname><cIP>4</cIP></Company><Company><cNname>5</cNname><cIP>5</cIP></Company> <Company><cNname>6</cNname><cIP>6</cIP></Company></DongFang>";
var xmlDoc = checkXMLDocObj(xmlstr);
var n;
var l;
var e = document.getElementById(oid);//得到下拉列表框控件
if(e!=null){
n = xmlDoc.getElementsByTagName(xPath);
l = n.length;
//循环添加列表子项
for(var i=0;i<l;i++){
e.options.add(new Option(n[i].getElementsByTagName("cNname")[0].firstChild.nodeValue, n[i].getElementsByTagName("cIP")[0].firstChild.nodeValue));
}
}
}
</script>
</HEAD>
<BODY onload="initializeSelect('company','Company')">
<select id='company' name='company' onChange='showValue()'>
<option selected='selected'></option>
</select>
</BODY>
</HTML>