js如何遍历取得xml中每个字节点的值

JavaScript09

js如何遍历取得xml中每个字节点的值,第1张

1、用 childNodes 属性,按顺序取

实现过程:首先创建一个 xml 对象,然后载入 xml 文件,再根据待取节点父节点在 xml 文件中的序号和本身的序号,确定待取节点的位置,最后返回待取节点的值。

//pId 待取节点父节点序号//cId 待取节点序号

function getXmlNodeValue(pId, cId) {

    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

    xmlDoc.async = false

xmlDoc.load("employeeInfo.xml")

var nodes = xmlDoc.documentElement.childNodes[pId].childNodes[cId]return nodes.childNodes[0].text

}

//调用方法:

alert(getXmlNodeValue(1, 2))

2、用 for 循环来取

实现过程:首先创建一个 ie 支持的 xml 对象,如果发生异常,是创建一个 FireFox 支持的空 xml 对象并返回空;然后载入 xml 文件,如要发生异常也返回空;最后,通过 for 循环遍历查找与传入的节点值相同的节点,找到后返回属于该节点的属性值。

//nodeValue 待取节点的所属节点值

function getXmlNodeValueFor(nodeValue){    

    var xmlDoc 

  try { 

    //创建一个 ie 支持的 XML 文档对象 

    xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

  }catch(e){

      try{

      //创建FireFox空的XML文档对象

      xmlDoc=document.implementation.createDocument("","",null)

}catch(e){

  alert(e.message)

  return ""

}

}

xmlDoc.async = false

try { 

    xmlDoc.load("employeeInfo.xml")

}catch(e){

    alert(e.message)

    return ""

}

var xd=xmlDoc.documentElement.childNodes

if(xd==null) 

    return ""

 var tempValue

for(var i=0i<xd.lengthi++){

    if(xd[i].childNodes[0].childNodes[0].nodeValue==nodeValue)        tempValue=xd[i].childNodes[2].childNodes[0].nodeValue

}

return tempValue

}

//调用方法:

alert(getXmlNodeValueFor("王佳琳"))

用xslt比较简单,而且速度也会比javascript遍历dom快很多。

function transformToTable(xmlUrl,xslUrl,appendTo){

var xmldom=document.implementation.createDocument()

xmldom.load(xmlUrl)

var xsldom=document.implementation.createDocument()

xsldom.load(xslUrl)

var xslProcessor=new XSLTProcessor()

xslProcessor.importStylesheet(xsldom)

var result=xslProcessor.transformToTragment(xmldom,document)

appendTo.appendChild(result)

}

只是简单写了写,提供大致思路

xsl和xslt的教程可以看http://www.w3course.net/xsl/index.htm

要把html的表格改成xml的可以用正则表达式去匹配innerHTML,这种方法当然是比较快的

还有就是遍历,比较麻烦,而且速度也会慢一些

function transformToXML(elem){

if (typeof elem=='string'){

var div=document.createElement('DIV')

div.style.display='none'

div.innerHTML=elem

document.body.appendChild(div)

elem=document.body.lastChild.getElementsByTagName('table')[0]

}

if (elem.nodeName!='TABLE') return

var result='<?xml version="1.0" encoding="utf-8" standalone="yes"?>'+"\n"

var titles=[],tr,i,j

result+='<booklist>'+"\n"

tr=elem.getElementsByTagName('tr')

if (tr[0].firstChild.nodeName=='th'){

for (i=0i<tr[0].childNodes.lengthi++){

if (tr[0].childNodes[i].nodeType==1){

titles.push(tr[0].childNodes[i].innerHTML.replace(/(^\s|\s$)/,''))

}

}

}

for(i=0i<tr.lengthi++){

result+='<book>'+"\n"

for(j=0j<tr[i].childNodes.lengthj++){

if (tr[i].childNodes[j].nodeType!=1) continue

if (!titles[j]){

titles[j]='item'

}

result+='<'+titles[j]+'>'

+tr[i].childNodes[j].innerHTML

+'</'+titles[j]+'>'+"\n"

}

result+='</book>'+"\n"

}

result+='</booklist>'+"\n"

return result

}

上面是一个遍历的函数,虽然还不完善,但是已经满足基本的功能了。可以在firebug里测试一下

console.log(transformToXML('<table><tr><td>some book</td></tr></table>'))

函数里面booklist和book之类的标签名

下面是一个正则表达式的函数

function transformToXML(elem){

if (typeof elem=='object'){

elem='<table>'+elem.innerHTML+'</table>'

}

return '<?xml version="1.0" encoding="utf-8" standalone="yes"?>'+

elem.replace(/<table(\s*)[^>]+>/,'<booklist>')

.replace(/<\/table>/,'</booklist>')

.replace(/<(\/?)(tbody|tfoot|thead)(\s*)[^>]+>/,'')

.replace(/<tr(\s*)[^>]+>/,'<book>')

.replace(/<\/tr>/,'</book>')

.replace(/<td(\s*)[^>]+>/,'<item>')

.replace(/<\/td>/,'</item>')

}