在Web页面上,可以使用下面的对象来解析和序列化XML:
- XMLSerializer 用来将DOM树序列化为字符串.
- DOMParser 用来将字符串解析为DOM树.
- XMLHttpRequest 用来将URL上的资源解析为DOM树.
第一部分: 如何创建一个XML文档
在本节中,我们会尝试使用不同的方法创建一个XMl文档(Document对象的实例).
将字符串解析为DOM树
var sMyString = "<a id=\"a\"><b id=\"b\">hey!<\/b><\/a>"; var oParser = new DOMParser(); var oDOM = oParser.parseFromString(sMyString, "text/xml"); // 打印出根元素的标签名或者解析的错误信息. dump(oDOM.documentElement.nodeName == "parsererror" ? "error while parsing" : oDOM.documentElement.nodeName);
通过JavaScript对象树(JXON)构建XML文档
查看JXON逆向算法.
将URL上的资源解析为DOM树
使用 XMLHttpRequest
下例将读取一个URL上的XML文件并将读取的字符串解析为DOM树.
var xhr = new XMLHttpRequest(); xhr.onload = function() { dump(xhr.responseXML.documentElement.nodeName); } xhr.onerror = function() { dump("Error while getting XML."); } xhr.open("GET", "example.xml"); xhr.responseType = "document"; xhr.send();
xhr.responseXML
就是解析得到的Document
对象.
使用io.js
使用io.js时,下面的代码也会解析一个文件到DOM树,和XMLHttpRequest
不一样的是,这种方法不能获取远程文件的内容:
var oFile = DirIO.get("ProfD"); // %Profile% dir oFile.append("extensions"); oFile.append("{5872365E-67D1-4AFD-9480-FD293BEBD20D}"); oFile.append("people.xml"); oDOM = (new DOMParser()).parseFromString(FileIO.read(oFile), "text/xml"); // 打印出根元素的标签名或者解析的错误信息. dump(oDOM.documentElement.nodeName == "parsererror" ? "error while parsing" : oDOM.documentElement.nodeName);
第二部分: 如何将给定的XML文档序列化成字符串
将DOM树序列化为字符串
首先, 参考文章 如何创建一个DOM树 来创建一个DOM树. 另外, 你也可以使用 XMLHttpRequest 来获取一个DOM树.
现在,我们开始将DOM树序列化为字符串.
var oSerializer = new XMLSerializer(); var sXML = oSerializer.serializeToString(doc);
如果在JS XPCOM组件(或者JS 模块)中, new XMLSerializer()
是不可用的. 可以使用下面的语句来替代:
var oSerializer = Components.classes["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Components.interfaces.nsIDOMSerializer); var sXML = oSerializer.serializeToString(doc);
将DOM树序列化为字符串并格式化
你可以使用XMLSerializer和
E4X 来打印出一个DOM树的经过格式化后的源代码.首先, 参考文章 如何创建一个DOM树 来创建一个DOM树. 另外, 你也可以使用 XMLHttpRequest 来获取一个DOM树.我们假定变量doc为生成的文档对象.
var oSerializer = new XMLSerializer(); var sPrettyXML = XML(oSerializer.serializeToString(doc)).toXMLString();
默认缩进为两个空格.你也可以使用 DOM:treeWalker 来写出更高性能的可以自定义缩进字符串的格式化工具.
注意: 使用E4X的toXMLString
方法会让你的XML文件中的CDATA元素丢失,只保留文字:
<content><![CDATA[This is the content]]></content>
经过toXMLString方法后
会成为
<content>This is the content</content>
序列化DOM树到文件
首先, 参考文章 如何创建一个DOM树 来创建一个DOM树. 另外, 你也可以使用 XMLHttpRequest 来获取一个DOM树.我们假定变量doc为生成的文档对象.
现在,我们开始序列化这个DOM树doc
到文件 (参考about using files in Mozilla):
var oFOStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); var oFile = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsILocalFile); // 获取profile目录 oFile.append("extensions"); // 扩展文件夹 oFile.append("{5872365E-67D1-4AFD-9480-FD293BEBD20D}"); // 扩展的GUID oFile.append("myXMLFile.xml"); // 文件名 oFOStream.init(oFile, 0x02 | 0x08 | 0x20, 0664, 0); // 写入,创建,截断 (new XMLSerializer()).serializeToStream(doc, oFOStream, ""); // doc变量是个DOM树 oFOStream.close();
序列化XMLHttpRequest生成的DOM树到文件
如果你已经使用XMLHttpRequest获取到了一个DOM树,则将上面的代码中的serializer.serializeToStream(doc, oFOStream, "")
替换为serializer.serializeToStream(xmlHttpRequest.responseXML.documentElement, oFOStream, "")
即可.xmlHttpRequest
是一个XMLHttpRequest
对象名.
处理过程是先将远程的XML文件转为DOM树,然后将DOM树序列化为数据流.根据你的需求,你也可以直接保存xmlHttpRequest.responseText
.
相关链接