解析和序列化XML

在Web页面上,可以使用下面的对象来解析和序列化XML:

第一部分: 如何创建一个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.

相关链接

 

文档标签和贡献者

 此页面的贡献者: ziyunfei
 最后编辑者: ziyunfei,