阅读 219

JavaScript高级程序设计(三)浏览器对 XML DOM 的支持

前言:

浏览器对 XPath 的支持 ..XML 曾一度是在互联网上存储和传输结构化数据的标准。XML 的发展反映了 Web 的发展,因为 DOM 标准不仅是为了在浏览器中使用,而且还为了在桌面和服务器应用程序中处理 XML 数据结构。在 没有 DOM 标准的时候,很多开发者使用 JavaScript 编写自己的 XML 解析器。自从有了 DOM 标准,所 有浏览器都开始原生支持 XML、XML DOM 及很多其他相关技术。

1 浏览器对 XML DOM 的支持

因为很多浏览器在正式标准问世之前就开始实现 XML 解析方案,所以不同浏览器对标准的支持不 仅有级别上的差异,也有实现上的差异。DOM Level 3 增加了解析和序列化能力。不过,在 DOM Level 3 制定完成时,大多数浏览器也已实现了自己的解析方案。

1.1 DOM Level 2 Core

可以像下面这样创建空 XML 文档:

let xmldom = document.implementation.createDocument(namespaceUri, root, doctype);   复制代码

在 JavaScript 中处理 XML 时,root 参数通常只会使用一次,因为这个参数定义的是 XML DOM 中 document 元素的标签名。namespaceUri 参数用得很少,因为在 JavaScript 中很难管理命名空间。 doctype 参数则更是少用。 要创建一个 document 对象标签名为的新 XML 文档,可以使用以下代码:

let xmldom = document.implementation.createDocument("", "root", null);   console.log(xmldom.documentElement.tagName); // "root"   let child = xmldom.createElement("child");   xmldom.documentElement.appendChild(child);   复制代码

这个例子创建了一个 XML DOM 文档,该文档没有默认的命名空间和文档类型。注意,即使不指定

命名空间和文档类型,参数还是要传的。命名空间传入空字符串表示不应用命名空间,文档类型传入 null 表示没有文档类型。xmldom 变量包含 DOM Level 2 Document 类型的实例,包括第 12 章介绍的.1 浏览器对 XML DOM 的支持 695
所有 DOM 方法和属性。在这个例子中,我们打印了 document 元素的标签名,然后又为它创建并添加 了一个新的子元素。 要检查浏览器是否支持 DOM Level 2 XML,可以使用如下代码:

let hasXmlDom = document.implementation.hasFeature("XML", "2.0");   复制代码

实践中,很少需要凭空创建 XML 文档,然后使用 DOM 方法来系统创建 XML 数据结构。更多是把 XML 文档解析为 DOM结构,或者相反。因为 DOM Level 2并未提供这种功能,所以出现了一些事实标准。

1.2 DOMParser 类型

Firefox 专门为把 XML 解析为 DOM 文档新增了 DOMParser 类型,后来所有其他浏览器也实现了该 类型。要使用 DOMParser,需要先创建它的一个实例,然后再调用 parseFromString()方法。这个方 法接收两个参数:要解析的 XML 字符串和内容类型(始终应该是"text/html")。返回值是 Document 的实例。来看下面的例子:

let parser = new DOMParser();   let xmldom = parser.parseFromString("<root><child/></root>", "text/xml");   console.log(xmldom.documentElement.tagName); // "root"   console.log(xmldom.documentElement.firstChild.tagName); // "child"   let anotherChild = xmldom.createElement("child");   xmldom.documentElement.appendChild(anotherChild);   let children = xmldom.getElementsByTagName("child");   console.log(children.length); // 2 复制代码

这个例子把简单的 XML 字符串解析为 DOM 文档。得到的 DOM 结构中是 document 元素, 它有个子元素。然后就可以使用 DOM 方法与返回的文档进行交互。 DOMParser 只能解析格式良好的 XML,因此不能把 HTML 解析为 HTML 文档。在发生解析错误时, 不同浏览器的行为也不一样。Firefox、Opera、Safari 和 Chrome 在发生解析错误时,parseFromString() 方法仍会返回一个 Document 对象,只不过其 document 元素是,该元素的内容为解 析错误的描述。下面是一个解析错误的示例:

<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">XML   Parsing Error: no element found Location: file:// /I:/My%20Writing/My%20Books/   Professional%20JavaScript/Second%20Edition/Examples/Ch15/DOMParserExample2.js Line   Number 1, Column 7:<sourcetext><root> ------^</sourcetext></parsererror>   复制代码

Firefox 和 Opera 都会返回这种格式的文档。Safari 和 Chrome 返回的文档会把元素 嵌入在发生解析错误的位置。早期 IE 版本会在调用 parseFromString()的地方抛出解析错误。由于 这些差异,最好使用 try/catch 来判断是否发生了解析错误,如果没有错误,则通过 getElements ByTagName()方法查找文档中是否包含元素,如下所示:

let parser = new DOMParser(),    xmldom,    errors;   try {    xmldom = parser.parseFromString("<root>", "text/xml");    errors = xmldom.getElementsByTagName("parsererror");    if (errors.length > 0) {   throw new Error("Parsing error!");    }   } catch (ex) {    console.log("Parsing error!");   }   复制代码

这个例子中解析的 XML 字符串少一个标签,因此会导致解析错误。IE 此时会抛出错误。 Firefox 和 Opera 此时会返回 document 元素为的文档,而在 Chrome 和 Safari 返回的文 档中,是的第一个子元素。调用 getElementsByTagName("parsererror") 可适用于后两种情况。如果该方法返回了任何元素,就说明有错误,会弹警告框给出提示。当然,此时 可以进一步解析出错误信息并显示出来。

1.3 XMLSerializer 类型

与 DOMParser 相对,Firefox 也增加了 XMLSerializer 类型用于提供相反的功能:把 DOM 文档 序列化为 XML 字符串。此后,XMLSerializer 也得到了所有主流浏览器的支持。 要序列化DOM文档,必须创建XMLSerializer 的新实例,然后把文档传给serializeToString() 方法,如下所示:

let serializer = new XMLSerializer();   let xml = serializer.serializeToString(xmldom);   console.log(xml);   复制代码

serializeToString()方法返回的值是打印效果不好的字符串,因此肉眼看起来有点困难。 XMLSerializer 能够序列化任何有效的 DOM 对象,包括个别节点和 HTML 文档。在把 HTML 文 档传给 serializeToString()时,这个文档会被当成 XML 文档,因此得到的结果是格式良好的。 注意 如果给 serializeToString()传入非 DOM 对象,就会导致抛出错误。

 伪原创工具 SEO网站优化  https://www.237it.com/

作者:张清悠
链接:https://juejin.cn/post/7035477262472331294


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐