JS解析,反解析 XML 的一些问题

2016-03-25 15:38:28 星期五

文章底部下面有提供把 字符串 变成 XML 对象的方法。

该方法,在 Chrome48 ,FireFox ,IE11 测试成功!

  1. stackoverflow XML有命名空间怎么办
  2. 有命名空间的节点,在各个浏览器下有兼容性问题
  3. 解析 字符串 到 XML对象的方法

1. ** stackoverflow XML有命名空间怎么办???**

但是 如果 XML节点,有命名空间,如 <namespace:Node></namespace:Node>

解析就报错,这个报错不是有因为 这个解析方法的问题,而是因为XML格式规定的。

如果XML有使用命名空间的,必须在 root 根节点声明,否则就报错。

如下:

  1. <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
  2. xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
  4. id="review-definitions" typeLanguage="http://www.w3.org/2001/XMLSchema"
  5. expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://activiti.org/bpmn20">
  6. <activiti:field name="type">
  7. <activiti:expression>Shell</activiti:expression>
  8. </activiti:field>
  9. <bpmndi:BPMNDiagram id="BPMNDiagram_ryantest130">
  10. <bpmndi:BPMNPlane bpmnElement="ryantest130" id="BPMNPlane_ryantest130">
  11. <BPMNShape id="BPMNShape_a22f130e-fcfc-411f-8323-f8d0b482d01f"
  12. bpmnElement="a22f130e-fcfc-411f-8323-f8d0b482d01f">
  13. <Bounds height="60" width="60" x="224" y="187"/>
  14. </BPMNShape>
  15. <BPMNShape id="BPMNShape_6fa449e4-bfd8-499d-bac0-de62e7b39c4a"
  16. bpmnElement="6fa449e4-bfd8-499d-bac0-de62e7b39c4a">
  17. <Bounds height="60" width="60" x="473" y="194"/>
  18. </BPMNShape>
  19. <BPMNShape id="BPMNShape_daf837d7-daeb-4c3b-b820-60cb84b82ddd"
  20. bpmnElement="daf837d7-daeb-4c3b-b820-60cb84b82ddd">
  21. <Bounds height="60" width="60" x="635" y="197"/>
  22. </BPMNShape>
  23. <BPMNShape id="BPMNShape_e2df6eed-3b1d-4a6e-b674-8e13364cde29"
  24. bpmnElement="e2df6eed-3b1d-4a6e-b674-8e13364cde29">
  25. <Bounds height="60" width="60" x="227" y="266"/>
  26. </BPMNShape>
  27. </bpmndi:BPMNPlane>
  28. </bpmndi:BPMNDiagram>
  29. </definitions>

2.有命名空间的节点,在各个浏览器下有兼容性问题

Firefox 下:

xmlDoc.getElementTagName('namespace:Node') 这样的方法,在 FireFox 下可以 获取到子节点, 但是,但是 Chrome48 下,拿不到

Chrome48 下:

xmlDoc.getElementTagName('Node') 需要去掉命名空间才可以获取到该节点

提供的解决方案:可以重写 XMLDocument.proptyoe.getElementsTagName

  1. let node = xml.getElementsByTagName('expression');
  2. if (!node.length) node = xml.getElementsByTagName('activiti:expression');

解析 字符串 到 XML对象的方法

  1. var XML = (function() {
  2. /**
  3. * 把字符串转换成 XMLDOC 对象
  4. * @param {[type]} xmlStr [description]
  5. * @return {[type]} [description]
  6. */
  7. function str2xml(xmlStr) {
  8. //跨浏览器,ie和火狐解析xml使用的解析器是不一样的。
  9. var xmlStrDoc = null;
  10. if (window.DOMParser) { // Mozilla Explorer
  11. var parser = new DOMParser();
  12. xmlStrDoc = parser.parseFromString(xmlStr, "text/xml");
  13. } else { // Internet Explorer
  14. xmlStrDoc = new ActiveXObject("Microsoft.XMLDOM");
  15. xmlStrDoc.async = "false";
  16. xmlStrDoc.loadXML(xmlStr);
  17. }
  18. return xmlStrDoc;
  19. }
  20. /*===============================XML2JSON START==========================*/
  21. /**
  22. * XML 转成 JSON 对象
  23. * @param {[type]} xml [description]
  24. * @return {[type]} [description]
  25. */
  26. function xml2Json(xml) {
  27. // Create the return object
  28. var obj = {};
  29. if (xml.nodeType == 1) { // element
  30. // do attributes
  31. if (xml.attributes.length > 0) {
  32. obj["@attributes"] = {};
  33. for (var j = 0; j < xml.attributes.length; j++) {
  34. var attribute = xml.attributes.item(j);
  35. obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
  36. }
  37. }
  38. } else if (xml.nodeType == 3) { // text
  39. obj = xml.nodeValue;
  40. }
  41. // do children
  42. if (xml.hasChildNodes()) {
  43. for (var i = 0; i < xml.childNodes.length; i++) {
  44. var item = xml.childNodes.item(i);
  45. var nodeName = item.nodeName;
  46. if (typeof(obj[nodeName]) == "undefined") {
  47. obj[nodeName] = xml2Json(item);
  48. } else {
  49. if (typeof(obj[nodeName].length) == "undefined") {
  50. var old = obj[nodeName];
  51. obj[nodeName] = [];
  52. obj[nodeName].push(old);
  53. }
  54. obj[nodeName].push ? obj[nodeName].push(xml2Json(item)) : obj[nodeName] = xml2Json(item);
  55. }
  56. }
  57. }
  58. return obj;
  59. };
  60. return {
  61. str2xml: str2xml,
  62. xml2Json: xml2Json,
  63. }
  64. })();

【001】JS解析,反解析XML的一些问题的更多相关文章

  1. js中递归解析xml

    xml结构: <RightMenuItems>  <Item Code="New" Name="新建" GroupCode="Edi ...

  2. zepto.js 源码解析

    http://www.runoob.com/w3cnote/zepto-js-source-analysis.html Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jqu ...

  3. 谷歌地图地理解析和反解析geocode.geocoder详解

    地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...

  4. angularjs-googleMap googleMap api地址解析与反解析

    1.js:根据地址得到经纬度var myplace=$scope.place;//获取输入的地址var geocoder = new google.maps.Geocoder();//创建geocod ...

  5. SAX解析和生成XML文档

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  6. js的预解析

    在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析).ES6引了let和const,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写 ...

  7. 谷歌地图地理解析和反解析geocode.geocoder详解(转)

    谷歌地图地理解析和反解析geocode.geocoder详解 谷歌Geocoder服务 实例代码 地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. ...

  8. underscore.js源码解析(五)—— 完结篇

    最近公司各种上线,所以回家略感疲惫就懒得写了,这次我准备把剩下的所有方法全部分析完,可能篇幅过长...那么废话不多说让我们进入正题. 没看过前几篇的可以猛戳这里: underscore.js源码解析( ...

  9. underscore.js源码解析(三)

    最近工作比较忙,做不到每周两篇了,周末赶着写吧,上篇我针对一些方法进行了分析,今天继续. 没看过前两篇的可以猛戳这里: underscore.js源码解析(一) underscore.js源码解析(二 ...

随机推荐

  1. C语言——打印“Hello World!”,这么简单?

    打印Hello World! #inculde <stdio.h> int main(){ printf("Hello World!"); return 0; } 第一 ...

  2. 源码速读及点睛:HashMap

    Java 8 HashMap的分离链表 从Java 2到Java 1.7,HashMap在分离链表上的改变并不多,他们的算法基本上是相同的.如果我们假设对象的Hash值服从平均分布,那么获取一个对象需 ...

  3. angularjs 从外部改变controller内的数据

    var appElement = document.querySelector('[ng-controller=seatsCtrl]'); var $scope = angular.element(a ...

  4. ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础

    ASP.NET MVC在原来ASP.NET的基础上抛弃了基于页面的架构风格,使用了全新的MVC(模型-视图-控制器)架构的一种技术. 目前,它和ASP.NET都共存在.NET Framework之上. ...

  5. 转载:SQL中Group By 的常见使用方法

    SQL中Group By 的常见使用方法  转载源:http://www.cnblogs.com/wang-meng/p/5373057.html 前言今天逛java吧看到了一个面试题, 于是有了今天 ...

  6. Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects

    最近项目中使用一个翻拍身份证信息识别活体检测的第三方框架,在使用时会偶然性的出现崩溃的现象,经过查找是因为第三方框架中有释放的内存区域再次引用引起的,因而补充一下相关知识点.   在Xcode Edi ...

  7. hdu 1828 Picture 切割线求周长

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. 深入理解MyBatis的原理:整个体系

    前言:工作中虽然用到了 MyBatis,可完全不知道为什么,再不学习就晚了,这里将记录我的学习笔记,整个 MyBatis 的体系. 一.简介 1.传统的JDBC JDBC 是一种典型的桥接模式. 使用 ...

  9. mysql 优化海量数据插入和查询性能

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  10. Java Web整合开发王者归来(JSP + Servlet + Struts + Hibernate + Spring) - 读书笔记

    第1章 状态码表示响应类型: 保留 表示请求成功地接收 完成请求客户需进一步细化请求 客户错误 服务器错误 Web服务器: Apache服务器,特长是处理静态页面,效率非常高. Tomcat提供对JS ...