首先介绍简单的理论:对于XML,我们可以理解它是一种树结构,它包含根,元素,属性,文本等内容。不同浏览器都有自己的解析器,把XML读入内存,并把它转换为可被 JavaScript 访问的 XML DOM 对象。微软的 XML 解析器与其他浏览器中的解析器是有差异的。微软的解析器支持对 XML 文件和 XML 字符串(文本)的加载,而其他浏览器使用单独的解析器。不过,所有的解析器都含有遍历 XML 树、访问、插入及删除节点的函数。如果你使用的是一个本地文件或者网络文件且该文件在是在本服务器,那么对于IE和其他浏览器来说都可以通过load(uRl),loadXML(strXML)来创建Xdom对象。但是对于文本,除IE外需要一个单独的解析器来处理。以下函数用于根据不同的浏览器来创建Xdom对象:

functionloadXMLDoc(){ varxmlDoc; //codeforIE if(window.ActiveXObject){ xmlDoc=newActiveXObject("Microsoft.XMLDOM");//创建空的微软XML文档对象 //xmlDoc.load(uRl); //loadXML()方法用于加载字符串(文本),而load()用于加载文件 xmlDoc.loadXML(xmlstr); } //codeforMozilla,Firefox,Opera,etc. elseif(document.implementation&&document.implementation.createDocument){ xmlDoc=document.implementation.createDocument("","",null); //xmlDoc.load(uRl); //InternetExplorer使用loadXML()方法来解析XML字符串,而其他浏览器使用DOMParser对象 parser=newDOMParser(); xmlDoc=parser.parseFromString(txt,"text/xml"); }else{ alert('Yourbrowsercannothandlethisscript'); } //关闭异步加载,这样可确保在文档完整加载之前,解析器不会继续执行脚本 xmlDoc.async=false; createTable(xmlDoc); }

方法内有具体的解析,我不再啰嗦,对于解析的内容,分为字符串和文本两种。首先定义一个字符串:

varxmlstr="<?xmlversion=\"1.0\"encoding=\"UTF-8\"?><goodss><goodsid=\"1\"> <name>数码相机</name><price>3206(元)</price></goods> <goodsid=\"2\"><name>联想笔记本电脑</name><price>3206(元)</price></goods></goodss>";

然后定义一个goods.xml文件:

<?xmlversion="1.0"encoding="UTF-8"?> <goodss> <goodsid="1"> <name>数码相机</name> <price>3206(元)</price> </goods> <goodsid="2"> <name>联想笔记本电脑</name> <price>3206(元)</price> </goods> </goodss>

通过取消和注释方式来选择是文本还是字符串。这个方法可以是通用的,下面再来解析这个Xdom对象:

functioncreateTable(xmldoc){ vargoodss=xmldoc.getElementsByTagName("goods"); for(vari=0;i<goodss.length;i++){ varg=goodss[i]; if(g.nodeType==1){ varname=g.getElementsByTagName("name")[0].childNodes[0].nodeValue; varprice=g.getElementsByTagName("price")[0].childNodes[0].nodeValue; varid=g.getAttribute("id"); document.write(id+"-->"+name+"-->"+price); document.write("<br/>"); } } }

对于使用到的函数和属性我们来解析一下:

一些典型的 DOM 属性x.nodeName - x 的名称 x.nodeValue - x 的值 x.parentNode - x 的父节点 x.childNodes - x 的子节点 x.attributes - x 的属性节点x.firstChild - x 的第一个子节点,等同于childNodes[0]x.lastChild - x 的最后一个子节点x.data - x 的内容,等同nodeValuex.length - x 的长度x.nodeType - x 的类型:1,元素,2,属性,3,文本,4,注释,5,文档在上面的列表中,x 是一个节点对象XML DOM 方法x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素,返回的是数组x.getAttribute(name) - 返回属性的值

注意出于安全方面的原因,现代的浏览器不允许跨域的访问。这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上。否则,xmlDoc.load() 将产生错误 "Access is denied"。

页面增加一个按钮来调用函数:

<inputtype="button"name="bxml"value="Read"onclick="loadXMLDoc()"/>

页面将会输出XMl内节点的属性和子节点的内容。对于一般应用来说,我觉得上面内容已经足够了。我会在之后补充一些其他操作。

声明:有的资源均来自网络转载,版权归原作者所有,如有侵犯到您的权益 请联系邮箱:our333@126.com我们将配合处理!

原文地址:JS跨浏览器解析XML应用发布于2021-11-25 16:34:02