DOM操作XML

前一篇博客介绍DOM操作HTML,主要是通过控制节点属性和方法,这篇博客中我们主要介绍内容为:

1、  JavaScript如何装载XML文件

2、  DOM如何操作XML

3、  如何解决浏览器处理空白信息的差异

一、JavaScript如何装载XML文件:

        XML是一种可扩展的标记语言,我们用来传输和存储数据,我们将数据赋予这种载体,传到前端的同时,需要解析XML,这里采用的是javascript解析xml,至于如何解析,就离不开上一节博客中介绍的DOM文档对象模型。虽然这种解析方式存在弊端,但是相对于用户体验度来说,这种方式的解析也占有一定的优势。

在HTML文件中引入JS文件方式和以前一样:


在HTML文件中编写JS代码:


IE浏览器装载XML文档对象:

if(window.ActiveXObject){
    //IE浏览器装载xml文档的对象
    var activexName=["MSXML2.DOMDocument","Miscrosoft.XmlDom"];
    var xmlObj;
    for(var i=0;i<activexName.length;i++){
    try{
        xmlObj=new ActiveXObject(activexName[i]);
        break;
       }catch(e){
                
     }            
  }

设置同步方式装载XML数据

     xmlObj.async=false;

装载XML的文件:

     xmlObj.load(xmldoc);

装载XML的字符串:

     xmlObj.loadXML(xmldoc);


非IE浏览器装载XML文档对象:

//装载XML文件:
xmlObj=document.implementation.createDocument("","",null);
//装载XML数据:
xmlObj.load(xmldoc);

//装载XML字符串:
xmlObj=new DOMParser();
var docRoot=xmlObj.parseFromString(xmldoc,"text/xml");
return docRoot.documentElement;

二、DOM操作XML

对XML装载完成之后就是利用XPATH技术获取XML中的内容,XPATH技术类似于SQL查询语言,都是通过一种表达式去查询满足条件的信息,下面是编写的一段XML文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book isdn="0001">
        <author>Wang</author>
        <name>AJAX Professional</name>
        <price>35</price>
    </book>
    <book isdn="0002">
        <author>Lee</author>
        <name>AJAX In Action</name>
        <price>65</price>
    </book>
    <book>
        <author>Zhu</author>
        <name>AJAX For Dummies</name>
        <price>40</price>
    </book>
    <author>aaa</author>
</books>

编写xpath.js文件:

    XPATH技术的核心就是两个方法的使用:selectNodes()selectSingleNode()。

   selectNodes()方法表示根据XPATH表达式找到满足条件的所有节点

其中的两个参数为需要查找的节点以及xpath表达式

function selectNodes(xmldoc,sXpath){
     if(window.ActiveXObject){
        //IE浏览器
        return xmldoc.selectNode(sXpath);
    }else if(window.XPathEvaluator){
        //非IE浏览器
        var xpathObj=new XPathEvaluator();
        if(xpathObj){
            var result=xpathObj.evaluate(sXpath,xmldoc,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
            var nodes=new Array();
            var node;
            while((node=result.iterateNext())!==null){
                nodes.push(node);
            }
            return nodes;
        }else{
            return null;
        }
    }else{
        return null;
    }
}

    selectSingleNode()方法表示根据XPATH表达式找到满足条件的第一个节点

其中的两个参数和selectNode()方法一样

function selectSingleNode(xmldoc,sXpath){
    if(window.ActiveXObject){
        //IE浏览器
        return xmldoc.selectSingleNode(sXpath);
    }else if(window.XPathEvaluator){
        //非IE浏览器
        var xpathObj=new XPathEvaluator();
        if(xpathObj){
            varresult=xpathObj.evaluate(sXpath,xmldoc,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
            return result.singleNodeValue;
        }else{
            return null;
        }
    }else{
        return null;
    }

}

    evaluate()方法返回的是一个节点列表,得到节点列表后再用iterateNext()方法来遍历这个列表中的所有节点。而ORDERED_NODE_ITERATOR_TYPE就是节点的列表,按照文档中节点的属性排列。

 

通过调用这两个方法来获取不同函数值,这样很方便的找到你想要的节点:
var rootElement=loadXML(true,"XPATH.xml");
//查找所有的author元素节点
//关键就是如何表示元素节点在DOM树中的路径
 //绝对路径/books/book/author
//相对路径
//全文档搜索法
//author写法 //book/author
varauthor1=selectNodes(rootElement,"/books/book/author");
//查找属性节点
//关键是先找到包含属性节点的元素节点
var isdn1=selectNodes(rootElement,"/books/book/@isdn");
//查找文本节点
//关键是找到包含文本节点的那个元素节点
vartext1=selectNodes(rootElement,"/books/book/name/text()");
//有条件的查找元素节点
//需要首先找到元素节点,然后在增加条件表达式
varbook1=selectNodes(rootElement,"/books/book[@isdn]");
//多个条件与关系的查找元素节点
//需要首先找到元素节点,然后每一个查询条件写到中括号中
var bookA1=selectNodes(rootElement,"/books/book[@isdn='0002'][price>35]");
//多个条件或关系的查找元素节点
//需要首先找到元素节点,然后每一个查询条件写成一个XPATH的表达式,这些表达式用|组合,表达或关系
varbookO1=selectNodes(rootElement,"/books/book[@isdn='0002'] |/books/book[price>35]”);

XPath:俗语“路径表达式”,及通过一种表示路径的表达式来查找我们需要的信息。

三、浏览器处理空白信息差异?

function removeBlank(doc){
if(doc.childNodes.length>1){
for(var loopIndex=0;loopIndex++){
var currentNode=doc.childNodes[loopIndex];
	if(currentNode.nodeType===1){
		removeBlank(currentNode);
	}
if(currentNode.nodeType===3 &&(/^\s+$/.test(currentNode.nodeValue))){
	doc.removeChild(doc.childNodes[loopIndex--]);
<span style="white-space:pre">	</span>}
    }
}

四、将DOM对象序列化成表示XML的字符串

IE浏览器中有一个xml的属性,可以获得对象所对应的XML字符串

非IE,新建一个XMLSerializer的对象,然后使用serialize To String方法将DOM对象转换成XML对象。

//封装不同浏览器对象序列化成DOM表示XML的字符串
 function serializeDOM(xmldoc){ 
if(xmldoc.xml){ 
//IE浏览器 
return xmldoc.xml;
 }else if(window.XMLSerializer){ 
//非IE
 	var seria=new XMLSerializer(); 
<span style="white-space:pre">	</span>return seria.serializeToString(xmldoc); 
<span style="white-space:pre">	</span>} 
   return null;
 }


    分析getElementById()在解析XML时是否合适?

首先XML中每一个元素节点不一定有id属性,其次XML中的两个元素节点有两个相同的id属性,在使用这个方法就不能找到唯一的节点,getElementsByTagName()方法一次获得的节点太多,还需要进行遍历获取数据,比较麻烦。最好的方法我们采用XPATH技术。








评论 76
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值