【001】JS解析,反解析XML的一些问题
JS解析,反解析 XML 的一些问题
2016-03-25 15:38:28 星期五
文章底部下面有提供把 字符串 变成 XML 对象的方法。
该方法,在 Chrome48 ,FireFox ,IE11 测试成功!
1. ** stackoverflow XML有命名空间怎么办???**
但是 如果 XML节点,有命名空间,如 <namespace:Node></namespace:Node>
解析就报错,这个报错不是有因为 这个解析方法的问题,而是因为XML格式规定的。
如果XML有使用命名空间的,必须在 root 根节点声明,否则就报错。
如下:
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"id="review-definitions" typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://activiti.org/bpmn20"><activiti:field name="type"><activiti:expression>Shell</activiti:expression></activiti:field><bpmndi:BPMNDiagram id="BPMNDiagram_ryantest130"><bpmndi:BPMNPlane bpmnElement="ryantest130" id="BPMNPlane_ryantest130"><BPMNShape id="BPMNShape_a22f130e-fcfc-411f-8323-f8d0b482d01f"bpmnElement="a22f130e-fcfc-411f-8323-f8d0b482d01f"><Bounds height="60" width="60" x="224" y="187"/></BPMNShape><BPMNShape id="BPMNShape_6fa449e4-bfd8-499d-bac0-de62e7b39c4a"bpmnElement="6fa449e4-bfd8-499d-bac0-de62e7b39c4a"><Bounds height="60" width="60" x="473" y="194"/></BPMNShape><BPMNShape id="BPMNShape_daf837d7-daeb-4c3b-b820-60cb84b82ddd"bpmnElement="daf837d7-daeb-4c3b-b820-60cb84b82ddd"><Bounds height="60" width="60" x="635" y="197"/></BPMNShape><BPMNShape id="BPMNShape_e2df6eed-3b1d-4a6e-b674-8e13364cde29"bpmnElement="e2df6eed-3b1d-4a6e-b674-8e13364cde29"><Bounds height="60" width="60" x="227" y="266"/></BPMNShape></bpmndi:BPMNPlane></bpmndi:BPMNDiagram></definitions>
2.有命名空间的节点,在各个浏览器下有兼容性问题
Firefox 下:
xmlDoc.getElementTagName('namespace:Node') 这样的方法,在 FireFox 下可以 获取到子节点, 但是,但是 Chrome48 下,拿不到
Chrome48 下:
xmlDoc.getElementTagName('Node') 需要去掉命名空间才可以获取到该节点
提供的解决方案:可以重写 XMLDocument.proptyoe.getElementsTagName
let node = xml.getElementsByTagName('expression');if (!node.length) node = xml.getElementsByTagName('activiti:expression');
解析 字符串 到 XML对象的方法
var XML = (function() {/*** 把字符串转换成 XMLDOC 对象* @param {[type]} xmlStr [description]* @return {[type]} [description]*/function str2xml(xmlStr) {//跨浏览器,ie和火狐解析xml使用的解析器是不一样的。var xmlStrDoc = null;if (window.DOMParser) { // Mozilla Explorervar parser = new DOMParser();xmlStrDoc = parser.parseFromString(xmlStr, "text/xml");} else { // Internet ExplorerxmlStrDoc = new ActiveXObject("Microsoft.XMLDOM");xmlStrDoc.async = "false";xmlStrDoc.loadXML(xmlStr);}return xmlStrDoc;}/*===============================XML2JSON START==========================*//*** XML 转成 JSON 对象* @param {[type]} xml [description]* @return {[type]} [description]*/function xml2Json(xml) {// Create the return objectvar obj = {};if (xml.nodeType == 1) { // element// do attributesif (xml.attributes.length > 0) {obj["@attributes"] = {};for (var j = 0; j < xml.attributes.length; j++) {var attribute = xml.attributes.item(j);obj["@attributes"][attribute.nodeName] = attribute.nodeValue;}}} else if (xml.nodeType == 3) { // textobj = xml.nodeValue;}// do childrenif (xml.hasChildNodes()) {for (var i = 0; i < xml.childNodes.length; i++) {var item = xml.childNodes.item(i);var nodeName = item.nodeName;if (typeof(obj[nodeName]) == "undefined") {obj[nodeName] = xml2Json(item);} else {if (typeof(obj[nodeName].length) == "undefined") {var old = obj[nodeName];obj[nodeName] = [];obj[nodeName].push(old);}obj[nodeName].push ? obj[nodeName].push(xml2Json(item)) : obj[nodeName] = xml2Json(item);}}}return obj;};return {str2xml: str2xml,xml2Json: xml2Json,}})();
【001】JS解析,反解析XML的一些问题的更多相关文章
- js中递归解析xml
xml结构: <RightMenuItems> <Item Code="New" Name="新建" GroupCode="Edi ...
- zepto.js 源码解析
http://www.runoob.com/w3cnote/zepto-js-source-analysis.html Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jqu ...
- 谷歌地图地理解析和反解析geocode.geocoder详解
地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...
- angularjs-googleMap googleMap api地址解析与反解析
1.js:根据地址得到经纬度var myplace=$scope.place;//获取输入的地址var geocoder = new google.maps.Geocoder();//创建geocod ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
- js的预解析
在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析).ES6引了let和const,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写 ...
- 谷歌地图地理解析和反解析geocode.geocoder详解(转)
谷歌地图地理解析和反解析geocode.geocoder详解 谷歌Geocoder服务 实例代码 地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. ...
- underscore.js源码解析(五)—— 完结篇
最近公司各种上线,所以回家略感疲惫就懒得写了,这次我准备把剩下的所有方法全部分析完,可能篇幅过长...那么废话不多说让我们进入正题. 没看过前几篇的可以猛戳这里: underscore.js源码解析( ...
- underscore.js源码解析(三)
最近工作比较忙,做不到每周两篇了,周末赶着写吧,上篇我针对一些方法进行了分析,今天继续. 没看过前两篇的可以猛戳这里: underscore.js源码解析(一) underscore.js源码解析(二 ...
随机推荐
- sql中全文检索CHARINDEX 和PATINDEX 区别
最近经常使用字符串查找功能. 包括 1.全匹配查找字符串 2.模糊查找字符串 CHARINDEX 和 PATINDEX 函数都返回指定模式的开始位置.PATINDEX 可使用通配符,而 CHARIND ...
- 自己写一个java的mvc框架吧(一)
自己写一个mvc框架吧(一) 目录 自己写一个mvc框架吧(一) 自己写一个mvc框架吧(二) 自己写一个mvc框架吧(三) 自己写一个mvc框架吧(四) 写之前的一些废话 废话 1 (总是要先随便说 ...
- JVM内存问题定位
一.查看机器资源使用状态: 使用top命令,内存占用较高的那个PID对应的进程一般就是JVM了 二.查看Swap状态: 使用free -m 命令,一般内存占用过高会导致swap占用也偏高,看看swap ...
- vue setTimeout--延迟操作
有时候我们在查询后要做某些事情,例如我查询的时候要根据某个值再去查询某些东西并和这些值一起显示的时候,我们可以对渲染数据的操作进行延迟,因为代码执行的速度是很快的而访问数据的操作相对于渲染的速度慢得多 ...
- K:单词查找树(Trie)
单词查找树,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.Trie可以看作是一个确定有限状态自动机(DFA).与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中 ...
- Python Django migrate 报错解决办法
1. 在现有基础上又添加一个表的时候migrate报错 migrate报错django.db.utils.OperationalError: (1050, "Table 'cmdb_eidc ...
- Swift 函数调用到底写不写参数名
最近真正开始学 Swift,在调用函数的时候遇到一个问题:到底写不写函数名? 我们来看两个个例子: // 1 func test(a: Int, b: Int) ->Int { return a ...
- sql语句执行出错:Incorrect integer value: '' for column 'id' at row 1
经检验:mysql5以上的版本如果是空值应该要写NULL. 例如:insert into web_works (work_id,work_name,work_number) values ('','$ ...
- 解决 login.live.com onedrive.live.com 等微软国外网站打不开问题
下面就分享一下通过更改HOSTS文件的方式打开onedrive网页版的方法. C:\Windows\System32\drivers\etc目录下的hosts文件把它复制到D盘,再复制一份放到桌面上. ...
- 【Android】Retrofit 2.0 的使用
一.概述 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库.来自官网的介绍: A type-safe HTTP client for Android ...