第 30 章 XML
第 30 章 XML
1.IE 中的 XML 2.DOM2 中的 XML
3.跨浏览器处理 XML
随着互联网的发展,Web 应用程序的丰富,开发人员越来越希望能够使用客户端来操作 XML 技术。而 XML 技术一度成为存储和传输结构化数据的标准。所以,本章就详细探讨一下 JavaScript 中使用 XML 的技术。
对于什么是 XML,干什么用的,这里就不在赘述了,在以往的 XHTML 或 PHP 课程都有涉及到,可以理解成一个微型的结构化的数据库,保存一些小型数据用的。
一.IE 中的 XML
在统一的正式规范出来以前,浏览器对于 XML 的解决方案各不相同。DOM2 级提出了动态创建 XML DOM 规范,DOM3 进一步增强了 XML DOM。所以,在不同的浏览器实现 XML 的处理是一件比较麻烦的事情。
1.创建 XMLDOM 对象
IE 浏览器是第一个原生支持 XML 的浏览器,而它是通过 ActiveX 对象实现的。这个对象,只有 IE 有,一般是 IE9 之前采用。微软当年为了开发人员方便的处理 XML,创建了 MSXML 库,但却没有让 Web 开发人员通过浏览器访问相同的对象。
var xmlDom = new ActiveXObject('MSXML2.DOMDocument');
ActiveXObject 类型
XML 版本字符串 说明
Microsoft.XmlDom 最初随同 IE 发布,不建议使用
MSXML2.DOMDocument 脚本处理而更新的版本,仅在特殊情况作为备份用
MSXML2.DOMDocument.3.0 在 JavaScript 中使用,这是最低的建议版本
MSXML2.DOMDocument.4.0 脚本处理时并不可靠,使用这个版本导致安全警告
MSXML2.DOMDocument.5.0 脚本处理时并不可靠,使用这个版本导致安全警告
MSXML2.DOMDocument.6.0 脚本能够可靠处理的最新版本
PS:在这六个版本中微软只推荐三种:
1.MSXML2.DOMDocument.6.0 最可靠最新的版本
2.MSXML2.DOMDocument.3.0 兼容性较好的版本
3.MSXML2.DOMDocument 仅针对 IE5.5 之前的版本
PS:这三个版本在不同的 windows 平台和浏览器下会有不同的支持,那么为了实现兼容,我们应该考虑这样操作:从 6.0->3.0->备用版本这条路线进行实现。
function createXMLDOM() { var version = [
'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i ++) {try {var xmlDom = new ActiveXObject(version[i]);return xmlDom;} catch (e) {//跳过}}throw new Error('您的系统或浏览器不支持 MSXML!'); //循环后抛出错误}
2.载入 XML
如果已经获取了 XMLDOM 对象,那么可以使用 loadXML()和 load()这两个方法可以分别载入 XML 字符串或 XML 文件。
xmlDom.loadXML('<root version="1.0"><user>Lee</user></root>');alert(xmlDom.xml);
PS:loadXML 参数直接就是 XML 字符串,如果想效果更好,可以添加换行符\n。.xml属性可以序列化 XML,获取整个 XML 字符串。
xmlDom.load('test.xml'); //载入一个 XML 文件alert(xmlDom.xml);
当你已经可以加载了 XML,那么你就可以用之前学习的 DOM 来获取 XML 数据,比如标签内的某个文本。
var user = xmlDom.getElementsByTagName('user')[0]; //获取<user>节点alert(user.tagName); //获取<user>元素标签alert(user.firstChild.nodeValue); //获取<user>里的值 Lee
DOM 不单单可以获取 XML 节点,也可以创建。
var email= xmlDom.createElement('email');xmlDom.documentElement.appendChild(email);
3.同步及异步
load()方法是用于服务器端载入 XML 的,并且限制在同一台服务器上的 XML 文件。那
么在载入的时候有两种模式:同步和异步。
所谓同步:就是在加载 XML 完成之前,代码不会继续执行,直到完全加载了 XML 再返回。好处就是简单方便、坏处就是如果加载的数据停止响应或延迟太久,浏览器会一直堵塞从而造成假死状态。
xmlDom.async = false; //设置同步,false,可以用 PHP 测试假死
所谓异步:就是在加载 XML 时,JavaScript 会把任务丢给浏览器内部后台去处理,不会造成堵塞,但要配合
readystatechange 事件使用,所以,通常我们都使用异步方式。
xmlDom.async = true; //设置异步,默认
通过异步加载,我们发现获取不到 XML 的信息。原因是,它并没有完全加载 XML 就返回了,也就是说,在浏览器内部加载一点,返回一点,加载一点,返回一点。这个时候,我们需要判断是否完全加载,并且可以使用了,再进行获取输出。
XML DOM 中 readystatechange 事件
就绪状态 说明
1 DOM 正在加载
2 DOM 已经加载完数据
3 DOM 已经可以使用,但某些部分还无法访问
4 DOM 已经完全可以
PS:readyState 可以获取就绪状态值
var xmlDom = createXMLDOM();xmlDom.async = true; //异步,可以不写xmlDom.onreadystatechange = function () {if (xmlDom.readyState == 4) { //完全加载了,再去获取 XMLalert(xmlDom.xml);}}
xmlDom.load(‘test.xml’); //放在后面重点体现异步的作用
PS:可以通过 readyState 来了解事件的执行次数,将 load()方法放到最后不会因为代码的顺序而导致没有加载。并且 load()方法必须放在 onreadystatechange 之后,才能保证就绪状态变化时调用该事件处理程序,因为要先触发。用 PHP 来测试,在浏览器内部执行时,是否能操作,是否会假死。
PS:不能够使用 this,不能够用 IE 的事件处理函数,原因是 ActiveX 控件为了预防安全性问题。
PS:虽然可以通过 XML DOM 文档加载 XML 文件,但公认的还是 XMLHttpRequest
对象比较好。这方面内容,我们在 Ajax 章节详细了解。
4.解析错误
在加载 XML 时,无论使用 loadXML()或 load()方法,都有可能遇到 XML 格式不正确的情况。为了解决这个问题,微软的 XML DOM 提供了 parseError 属性。
parseError 属性对象
属性 说明
errorCode 发生的错误类型的数字代号filepos 发生错误文件中的位置line 错误行号linepos 遇到错误行号那一行上的字符的位置reason 错误的解释信息
if (xmlDom.parseError == 0) {
alert(xmlDom.xml);
} else { throw new Error('错误行号:' + xmlDom.parseError.line +'\n 错误代号:' + xmlDom.parseError.errorCode +'\n 错误解释:' + xmlDom.parseError.reason);}
二.DOM2 中的 XML
IE 可以实现了对 XML 字符串或 XML 文件的读取,其他浏览器也各自实现了对 XML
处理功能。DOM2 级在 document.implementaion 中引入了 createDocument()方法。IE9、Firefox、Opera、Chrome 和 Safari 都支持这个方法。
1.创建 XMLDOM 对象
var xmlDom = document.implementation.createDocument('','root',null); //创建 xmlDomvar user = xmlDom.createElement('user'); //创建 user 元素xmlDom.getElementsByTagName('root')[0].appendChild(user); //添加到 root 下var value = xmlDom.createTextNode('Lee'); //创建文本xmlDom.getElementsByTagName('user')[0].appendChild(value); //添加到 user 下alert(xmlDom.getElementsByTagName('root')[0].tagName);alert(xmlDom.getElementsByTagName('user')[0].tagName);alert(xmlDom.getElementsByTagName('user')[0].firstChild.nodeValue);
PS:由于 DOM2 中不支持 loadXML()方法,所以,无法简易的直接创建 XML 字符串。所以,只能采用以上的做法。
PS:createDocument()方法需要传递三个参数,命名空间,根标签名和文档声明,由于 JavaScript 管理命名空间比较困难,所以留空即可。文档声明一般根本用不到,直接 null 即可。命名空间和文档声明留空,表示创建 XMLDOM 对象不需要命名空间和文档声明。
PS:命名空间的用途是防止太多的重名而进行的分类,文档类型表明此文档符合哪种规范,而这里创建 XMLDOM 不需要使用这两个参数,所以留空即可。
2.载入 XML
DOM2 只支持 load()方法,载入一个同一台服务器的外部 XML 文件。当然,DOM2 也有 async 属性,来表面同步或异步,默认异步。
//同步情况下
var xmlDom = document.implementation.createDocument('','root',null);xmlDom.async = false;xmlDom.load('test.xml');alert(xmlDom.getElementsByTagName('user')[0].tagName);//异步情况下var xmlDom = document.implementation.createDocument('','root',null);xmlDom.async = true;addEvent(xmlDom, 'load', function () { //异步直接用 onload 即可alert(this.getElementsByTagName('user')[0].tagName);});xmlDom.load('test.xml');
PS:不管在同步或异步来获取 load()方法只有 Mozilla 的 Firefox 才能支持,只不过新版的 Opera 也是支持的,其他浏览器则不支持。
3.DOMParser 类型
由于 DOM2 没有 loadXML()方法直接解析 XML 字符串,所以提供了 DOMParser 类型来创建 XML DOM 对象。IE9、Safari、Chrome 和 Opera 都支持这个类型。
var xmlParser = new DOMParser(); //创建 DOMParser 对象var xmlStr = '<user>Lee</user></root>'; //XML 字符串var xmlDom = xmlParser.parseFromString(xmlStr, 'text/xml'); //创建 XML DOM 对象
alert(xmlDom.getElementsByTagName(‘user’)[0].tagName); //获取 user 元素标签名
PS:XML DOM 对象是通过 DOMParser 对象中的 parseFromString 方法来创建的,两个
参数:XML 字符串和内容类型 text/xml。
4.XMLSerializer 类型
由于 DOM2 没有序列化 XML 的属性,所以提供了 XMLSerializer 类型来帮助序列化
XML 字符串。IE9、Safari、Chrome 和 Opera 都支持这个类型。var serializer = new XMLSerializer(); //创建 XMLSerializer 对象var xml = serializer.serializeToString(xmlDom); //序列化 XMLalert(xml);
5.解析错误
在 DOM2 级处理 XML 发生错误时,并没有提供特有的对象来捕获错误,而是直接生成另一个错误的 XML 文档,通过这个文档可以获取错误信息。
var errors = xmlDom.getElementsByTagName('parsererror');if (errors.length > 0) {throw new Error('XML 格式有误:' + errors[0].textContent);}
PS:errors[0].firstChild.nodeValue 也可以使用 errors[0].textContent 来代替。
三.跨浏览器处理 XML
如果要实现跨浏览器就要思考几个个问题:1.load()只有 IE、Firefox、Opera 支持,所以无法跨浏览器;2.获取 XML DOM 对象顺序问题,先判断先进的 DOM2 的,然后再去判断落后的 IE;3.针对不同的 IE 和 DOM2 级要使用不同的序列化。4.针对不同的报错进行不同的报错机制。
//首先,我们需要跨浏览器获取 XML DOM function getXMLDOM(xmlStr) {
var xmlDom = null;if (typeof window.DOMParser != 'undefined') { //W3CxmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml'); var errors = xmlDom.getElementsByTagName('parsererror');if (errors.length > 0) {throw new Error('XML 解析错误:' + errors[0].firstChild.nodeValue);}} else if (typeof window.ActiveXObject != 'undefined') { //IE var version = [
'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i ++) { try {
xmlDom = new ActiveXObject(version[i]); } catch (e) {
//跳过}}xmlDom.loadXML(xmlStr); if (xmlDom.parseError != 0) {
throw new Error('XML 解析错误:' + xmlDom.parseError.reason);}} else { throw new Error('您所使用的系统或浏览器不支持 XML DOM!');
}return xmlDom;}
//其次,我们还必须跨浏览器序列化
XML function serializeXML(xmlDom) {var xml = '';if (typeof XMLSerializer != 'undefined') {xml = (new XMLSerializer()).serializeToString(xmlDom);} else if (typeof xmlDom.xml != 'undefined') { xml = xmlDom.xml;
} else {throw new Error('无法解析 XML!');}return xml;}
PS:由于兼容性序列化过程有一定的差异,可能返回的结果字符串可能会有一些不同。至于 load()加载 XML 文件则因为只有部分浏览器支持而无法跨浏览器。
相关文章:
第 30 章 XML
第 30 章 XML 1.IE 中的 XML 2.DOM2 中的 XML 3.跨浏览器处理 XML 随着互联网的发展,Web 应用程序的丰富,开发人员越来越希望能够使用客户端来操作 XML 技术。而 XML 技术一度成为存储和传输结构化数据的标准。所以,本章就详细探讨一下 Ja…...
VMware下的ubuntu显示文字太小的自适应显示调整
我的情况 我使用的是4K的32寸显示器,分辨率为 3840 x 2160,ubuntu版本为18.04,默认的情况下系统分辨率为 3466 x 1842。 此时,显示的文字很小,虽然可以看清,但也比较吃力,在VMware窗口…...
外贸网站怎么搭建对谷歌seo比较好?
外贸网站怎么搭建对谷歌seo比较好?搭建一个网站自然不复杂,但要想搭建一个符合谷歌seo规范的网站,那就要多注意了,你的网站做的再酷炫,再花里胡哨,但如果页面都是js代码,或者页面没有源代码内容…...
如何创建网络白名单
网络白名单(Whitelist)是指允许通过网络访问的特定设备、IP地址、应用程序或网站。与黑名单(Blacklist)相反,白名单机制默认阻止所有连接,只有在白名单中明确允许的访问才能通过。这种策略可以提高网络的安…...
前端动态创建svg不起效果?
document.createElement(path);诸如此类的创建一般都是不太行的 我在创建这个之后,虽然在网页上是有相应的结构,但是完全不显示 一般正确的创建方式为 document.createElementNS(http://www.w3.org/2000/svg,path);在使用document.createElementNS(“ht…...
三、Drf request对象
3.1django和drf中的request的区别 django中的request:用户请求对象和参数 drf中的request:将django中的request加了一层封装,又加了一些其它的参数 drf中的request._requestdjango中的request 3.2创建url路由和CBV class UserView(APIView):def get(self,requ…...
CMIS5.2_光模块切应用(Application Selection and Instantiation)
目录 重要概念 DP配置、应用声明、应用码的区别 Control Set Provision 和 Commission ApplyDPInit 和 ApplyImmediate 判断应用是否切换成功 以800G光模块的3个应用对应的DP配置举例 1*800G应用: 2*400G应用: 8*100G应用: 应用声明…...
网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)
DVWA Weak Session IDs(弱会话) 文章目录 DVWA Weak Session IDs(弱会话)Low LevelMedium LevelHigh LevelImpossible Level 参考文献 WEB 安全靶场通关指南 相关阅读 Brute Force (爆破) Command Injection(命令注入…...
828华为云征文|华为云 Flexus X 实例初体验
一直想有自己的一款的服务器,为了更好的进行家庭娱乐,甚至偶尔可以满足个人搭建开发环境的需求,直到接触到了华为云 Flexus X 云服务器。Flexus 云服务器 X 实例是面向中小企业和开发者打造的轻量级云服务器。提供快速应用部署和简易的管理能…...
欧科云链OKLink相约TOKEN2049:更全面、多元与安全
过去几日,OKLink 与全球 Web3 从业者与爱好者们相约狮城。在多场激动人心的活动上分享了我们的产品进展、有关于链上数据的专家观点以及打磨产品的经验。同时也听到了很多来自行业的宝贵声音。跟随我们的脚步,捕捉这充实一周的精彩瞬间: 1、…...
遥感影像-语义分割数据集:云数据集详细介绍及训练样本处理流程
原始数据集详情 简介:该云数据集包括150张RGB三通道的高分辨率图像,在全球不同区域的分辨率从0.5米到15米不等。这些图像采集自谷歌Earth的五种主要土地覆盖类型,即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型谷歌Earth覆盖区…...
【有啥问啥】SimAM(Similarity-Aware Activation Module)注意力机制详解
SimAM(Similarity-Aware Activation Module)注意力机制详解 引言 在计算机视觉领域,注意力机制通过引导模型关注图像中的关键区域,显著提升了模型处理和理解图像的能力。SimAM(Similarity-Aware Activation Module&a…...
鸿蒙应用开发,如何保存登录信息
在鸿蒙应用开发中,保存登录信息是实现用户自动登录、个性化展示等功能的基础。以下是一些常用的保存登录信息的方法: 一、全局状态管理 对于简单的应用,可以在全局范围内定义一个类(如UserManager),使用单…...
★ C++进阶篇 ★ map和set
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C进阶篇第四章----map和set ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-CSDN博客 C基础篇专栏:★ C基础篇 ★_椎名澄嵐的博客-CSDN博…...
Python知识点:如何使用Nvidia Jetson与Python进行边缘计算
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Nvidia Jetson与Python进行边缘计算 Nvidia Jetson平台是专为边缘计算设…...
动态分配内存
目录 前言 一.malloc,free函数 1.malloc,free函数原型 2.使用方法 3.具体实例 4.注意事项 二.calloc函数 1.calloc函数原型 2.主要特点 3.使用案例 三.realloc函数 1.realloc函数原型 2.使用案例 3.注意事项 前言 动态内存是指在程序运行时,按需分配和…...
Unity Input System自动生成配置
参考视频 创建及配置新输入系统 New Input System|Unity2022.2 最新教程《勇士传说》入门到进阶|4K_哔哩哔哩_bilibili ProjectSettings设置 Unity编辑器菜单栏选择Edit->Project Settings->Player->Other Settings,将Api Compatibility Level…...
【Windows】在任务管理器中隐藏进程
在此前的一篇,我们已经介绍过了注入Dll 阻止任务管理器结束进程 -- Win 10/11。本篇利用 hook NtQuerySystemInformation 并进行断链的方法实现进程隐身,实测支持 taskmgr.exe 的任意多进程隐身。 任务管理器 代码: // dllmain.cpp : 定义 …...
【TypeScript学习】TypeScript基础学习总结二
主要记录ts中的类、接口与泛型 1.类 无论是在哪种语言中,类都是面向对象编程(OOP)的一个主要实现方式。能够实现代码更加灵活,更具有结构化。类作用都是提供一个模板,通过类可以创建多个具有相同结构的对象。 // 类的定义,与对象…...
中国电信解锁万亿参数大模型:TeleAI的创新与突破
首个由万卡集群训练出来的万亿参数大模型,已被一家央企解锁。 具体而言,为了推动纯国产人工智能的探索,带来这条新路径的正是中国电信人工智能研究院(TeleAI)。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…...
戴尔PowerEdge R840服务器亮黄灯 不开机
最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…...
【前端安全】js逆向之微信公众号登录密码
❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 随着发展,越来越多的登录页面添加了密码加密的措施,使得暴力破解变得不在简单&a…...
C# 泛型使用案例_C# 泛型使用整理
一、系统自带常用的泛型 1.字典,集合 //字典 Dictionary<string, int> dic new Dictionary<string, int>(); //泛型集合 List<int> list new List<int>(); 2.泛型委托,输入参数,输出参数 //泛型 委托---输出参…...
Docker 安装 Citus 单节点集群:全面指南与详细操作
Docker 安装 Citus 单节点集群:全面指南与详细操作 文章目录 Docker 安装 Citus 单节点集群:全面指南与详细操作一 服务器资源二 部署图三 安装部署1 创建网络2 运行脚本1)docker-compose.cituscd1.yml2)docker-compose.cituswk1.…...
Arthas redefine(加载外部的.class文件,redefine到JVM里 )
文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine(加载外部的.class文件,redefine到JVM里 )举例1:加载新的代码,jad/mc 命令使用举例2:上传 .class 文件到服务器的技巧 本人其他相关文章…...
C++教程(三):c++常用的配置文件类型
目录 1. INI 文件 2. JSON 文件 3. YAML 文件 4. XML 文件 5. TOML 文件 6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等) 总结 在 C 项目中,常用的配置文件类型有多种选择,具体选择取决于项目的复杂性、可读性…...
Arduino Uno控制雨滴传感器模块的设计方案
以下是Arduino Uno控制雨滴传感器模块的设计方案: 一、硬件准备: 1. Arduino Uno 开发板一块。 2. 雨滴传感器模块一个。 3. 杜邦线若干。 4. 9V直流电源一个。 二、硬件连接: 1. 将Arduino Uno板的Vin引脚、GND引脚分别连接到9V直流电…...
华为常见命令手册
常见命令 display ip interface brief —> 查看设备上的每个接口的IP地址【地址/掩码/状态】 display interface gi0/0/0 → 查看该接口的MAC 地址 ipconfig → 查看 PC 上面的 IP地址 display arp → 查看设备的 ARP 表 arp -a → 查看 PC 上面的 ARP 表 display m…...
TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点
论文标题: 英文:TinyAP: An intelligent Access Point to combat Wi-Fi attacks using TinyML中文:TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点 作者信息: Anand Agrawal 和 Rajib Ranjan Maiti,来自印…...
grafana频繁DataSourceError问题
背景 随着 Grafana 数据量的不断增加,逐渐暴露出以下问题: Grafana 页面加载缓慢;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题,大家可以参考这篇文章:Grafana 加载缓慢的解决方案。 不过…...
信息化建设网站范本/那种网站怎么搜关键词
第一问:当时第一感觉换不换没什么区别 第二问:经过分析验证以后发现,改变选择以后获得汽车的概率更大一些。 如果不改变选择,获得汽车的概率为1/3,这个比较容易证得。 如果改变选择,有三种情况:…...
杭州高端网站建设到蓝韵网络/推广软件哪个好
1 /**********************************************2 状态机示例3 功能:从屏幕输入1,则输出yes,输入其他值输出no4 ***********************************************/5 #include <stdio.h>6 #include <string.h>7 8 /* 在各状态之间传递的…...
做外贸a货网站/广州seo公司哪个比较好
关键时刻,第一时间送达!本文参考http://www.wanbizu.com/baike/201408081395.html我在上一篇文章中讨论了如何用 Swift 语言实现基本的区块链。在这篇文章里会使用服务器端 Swift 框架 Vapor 在云端实现区块链。通过 HTTP 协议来构建区块链 Web API&…...
如何建立一个公网可以访问的网站/2022年热点营销案例
首先下载安装git:https://git-scm.com/downloads/ 一路默认,安装完成后,打开文件夹C:\Users\Administrator\.ssh(Administrator是当前用户名),在空白处点鼠标右键选择“Git Bush Here” ,打开g…...
wordpress建外贸站/如何做百度推广
4 ENSP之Vxlan实验 拓扑 4.1 初始化配置 CE交换机配置完成之后需要commit提交下,不然命令不生效. 创建vlan并放行 SW1 sysname SW1 vlan batch 10 20 interface Ethernet0/0/1port link-type trunkport trunk allow-pass vlan 10 20 # interface Ethernet0/0/2po…...
网站设置在哪/网页制作免费模板
我的世界scpv3模组是一款超级令人喜欢的模组手机版本了,能够在手机里面体验到全新的内容的游戏。玩家们可以加入这款特别的像素游戏,加入独特的沙盒模式中挑战,更有趣味的沙盒内容可以来体验,给玩家们独特的游戏内容。我的世界scp…...