首页 > 代码库 > 原生javascript解析xml文档

原生javascript解析xml文档

之前写过一篇 《javascript/jQuery解析或转换json和xml》链接是http://my.oschina.net/ososchina/blog/343748,这篇博客详细解释了json使用 JSON.js  window.eval() ,jQuery

与字符串互相转换的方法 ,顺便也说了一点jQuery解析xml文档的方法,这里着重论述javascript操作xml。


顺便提一下,今天做项目有一点问题,如何让服务程序接口返回的就是json,而不需要 使用 jQuery.ajax设置 dataType就能得到json呢?

众所周知,服务端的 数据以json字符串输出,文档类型是 “text/html”,因此返回前台的默认是字符串,如果返回前台的指定为json,

需要设置http响应头application/json,这样返回的直接就是json对象了。

注意,必须在输出流之前设置响应头

//java中

response.setContentType("application/json;charset=UTF-8"); //
request.setCharacterEncoding("UTF-8");

//php
header(‘application/json;charset=utf-8‘);


好了,现在说今天的主角<

原生javascript解析xml文档

>

var loadXML = function(xmlString){ //构建xmldoc对象
   
     var xmlDoc=null;
      
      if(window.DOMParser)
      {
            try{
                
                domParser = new  DOMParser();
                xmlDoc = domParser.parseFromString(xmlString, ‘text/xml‘);
            }catch(e){
            }
        }
        else if(!window.DOMParser && window.ActiveXObject)
        {   //window.DOMParser 判断是否是非ie浏览器
            var xmlDomVersions = [‘MSXML2.DOMDocument‘,‘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){
                    continue;
                }
            }
        }
        else{
            return null;
        }

        return xmlDoc;
    }

给个数据源

var datasource = ‘<?xml version="1.0" encoding="utf-8" ?>  
<bookstore>  
  <book id="No1">  
      <title>An Introduction to XML</title>  
      <author>Chunbin</author>  
      <year>2010</year>  
      <price>98.0</price>      
    </book>  
  <book id="No2">  
      <title>The Performance of DataBase</title>  
      <author>John</author>  
      <year>1996</year>  
      <price discount=‘7‘ data=http://www.mamicode.com/‘8‘>56.0  > 

然后来使用,用法很简单

var xmlDoc = loadXML(datasource);
if(xmlDoc)  //xml的解析和html doc几乎完全相同,可以使用 xmlDoc.getElementById(),xmlDoc.getElementsByTagName(),xmlDoc.getElementsByClassName
{
   var books= xmlDoc.getElementsByTagName(‘book‘);
   var book = xmlDoc.getElementById(‘No2‘);
   
   if(books)
   {
        for(var i=0;i<books.length;i++)
        {
            var title = books[i].getEelementsByTagName(‘title‘)[0].firstChild.nodeValue; //确实有点长,因为
            var author = books[i].getEelementsByTagName(‘author‘)[0].innerHTML;//变短点
            var year = books[i].getEelementsByTagName(‘year‘)[0].innerHTML; //或者这样
            var price = Number(books[i].getEelementsByTagName(‘price‘)[0].innerHTML);
            
          //有值了,下一步不是我的事了
        }
        
        //获取属性使用 attributes,得到的是nodevaluemap
       var attrs = book.attributes;
       
       for(var i=0;i<attrs.length;i++)
       {
           var attr = attrs[i];
           var attr_name = attr.name;
           var attr_value =  attr.value;          
       }   
   }
}

-----------------------------------------------------------------

常用方法,属性api

attributes: 
id
length
childElementCount
childNodes
children
className
firstChild
firstElementChild
innerHTML(只读)
lastChild
lastElementChild
localName
nextSibling
nodeName
nodeType
nodeValue
ownerDocument
parentNode
prefix(新)-->表示前缀,xml允许前缀
namespaceURI(新)-->表示命名空间
previousSibling
tagName

注意:xml是字符串数据,一般来说是只读的属性,即使使用某些手段修改,但也不能做到持久化。因为除了文件上传外js不允许进行io操作

javascript解析xml就此结束


try doing it!

原生javascript解析xml文档