mozilla
您的搜索结果

    解析和序列化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,