【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 Explorer
var parser = new DOMParser();
xmlStrDoc = parser.parseFromString(xmlStr, "text/xml");
} else { // Internet Explorer
xmlStrDoc = 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 object
var obj = {};
if (xml.nodeType == 1) { // element
// do attributes
if (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) { // text
obj = xml.nodeValue;
}
// do children
if (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 Server数据类型转换方法
在SQL Server日常的函数.存储过程和SQL语句中,经常会用到不同数据类型的转换.在SQL Server有两种数据转换类型:一种是显性数据转换:另一种是隐性数据转换.下面分别对这两种数据类型转换 ...
- C# 很少人知道的科技
本文来告诉大家在C#很少有人会发现的科技.即使是工作了好多年的老司机也不一定会知道,如果觉得我在骗你,那么请看看下面 因为C#在微软的帮助,已经从原来很简单的,到现在的很好用.在10多年,很少人知道微 ...
- 面试1 SQL SERVER 查询第20行到30之间的数据
SQL SERVER 查询第20行到30之间的数据 1.先查询前20行的ID,后查询除去20条记录的前10条记录 SELECT TOP 10 * FROM tbBank WHERE BankID NO ...
- [转] ASP.NET MVC 模型绑定的功能和问题
摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术, ...
- mysql sql语句大全(MySQL语句 整理一)
1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...
- [日常] Apache Order Deny,Allow的用法
Order Deny,Allow的用法:影响最终判断结果的只有两点:1. order语句中allow.deny的先后顺序,最后的是最优先的:2. allow.deny语句中各自包含的范围. 常用:Or ...
- Spring Boot学习笔记(八)使用jar和war方式打包并在外部Tomcat中部署运行
使用war包的方式发布到外部Tomcat中去 首先修改pom.xml中的配置,使打包方式设置为war包的形式 然后 maven update project 更新下项目 Application入口文件 ...
- win8.1 pro-64位下安装配置MinGW—64位
1.下载MinGW-w64位:http://mingw-w64.org/doku.php 点击Downloads 说明:这边使用的是在线安装方式: 在网站里可以看到他安装后的文件夹: 2.安装 运行m ...
- Zookeeper学习文章目录1
目录:参考文章如下 1.ZooKeeper学习第一期---Zookeeper简单介绍 2. ZooKeeper学习第二期--ZooKeeper安装配置 3. ZooKeeper学习第三期---Zook ...
- Bootstrap学习笔记01
1.Make Images Mobile Responsive 用处: 使图片适配你的页面宽度. 操作: 给图片添加 .img-responsive class属性. <img src= ...