DOM2级核心

docuent.implementation中引入了createDocument()方法,IE9支持该方法,如:

var xmldom = document.implementation.createDocument(namespaceUri, root, doctype);

一般来说只用传第二个参数即可:

var xmldom = document.implementation.createDocument("", "root", null);

创建一个新的、文档元素为root的XML文档,可以使用下面代码:

var xmldom = document.implementation.createDocument("", "root", null); 命名空间URI为空字符表示未指定命名空间,给文档类型传入null即不指定文档类型。
console.log(xmldom.documentElement.tagName); //"root"

var child = xmldom.createElement("child");
xmldom.documentElement.appendChild(child);

DOMParser类型

Firefox、Opera、Chrome、Safari支持(IE8不支持),

  • DOMParse类型可将XML解析为DOM文档。

创建一个DOMParse实例,再调用

  • parseFromString()方法。这个方法接受两个参数:要解析的XML字符串和内容类型(内容类型始终为"text/xml")。返回值是一个Document实例。

如:

var parser = new DOMParse();
var xmldom = parser.parseFromString("<root><child/></root>", "text/xml");

alert(xmldom.documentElement.tagName); //"root"
alert(xmldom.documentElement.firstChild.tagName); //"child"
var anotherChild = xmldom.createElement("child");
xmldom.documentElement.appendChild(anthorChild);
var children = xmldom.getElementsByTagName("child");
alert(children.length); //2

发生解析错误时,仍然会从parseFromString()中返回一个Document对象。但这个对象的文档元素是

  • <parsererror>(Firefox、Opera);对象根元素第一个子元素为<parsererro>(Safari、Chrome)。

parseerror元素的内容是对解析错误地描述。通过getElementsByTagName()查找parsererror确定是否有解析错误。

var parser = new DOMParser(),
    xmldom,
    errors;
try {
    xmldom = parser.parseFromString("<root>", "text/xml"); //这里少了一个闭标签</root>
    errors = xmldom.getElementsByTagName("parsererror");
    if (errors.length > 0) {
        throw new Error("Parsing error!");
    }
} catch (ex) {
    console.log(ex.message); //Parsing error!
}

XMLSerializer类型

此类可将DOM文档序列化为XML字符串。(IE6~8不支持)。

要序列化DOM文档,首相必须创建XMLSerializer实例,然后将文档传入其serializerToString()方法:

var xmldom = document.implementation.createDocument("", "root", null);
xmldom.documentElement.appendChild(xmldom.createElement("child"));

var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmldom);

console.log(xml); //<root><child/></root>

IE8之前版本中的XML

(略)

虽然可以通过XML DOM文档对象加载XML文件,但公认的还是使用XMLHttpRequest对象比较好。

跨浏览器处理XML

解析XML

function parseXml(xml) {
    var xmldom = null;
    if (typeof DOMParser != "undefined") {
        xmldom = (new DOMParser()).parseFromString(xml, "text/xml");
        var errors = xmldom.getElementsByTagName("parsererror");
        if (errors.length > 0) {
            throw new Error("XML parsing error: " + errors[0].textContent);
        }
    } else if (typeof ActiveXObjext != "undefined") {
        xmldom = createDocument();
        xmldom.loadXML(xml);
        if (xmldom.parseError != 0) {
            throw new Error("XML parsing error: " + xmldom.parseError.reason);
        }
    } else {
        throw new Error("No XML parser available.");
    }
    return xmldom;
}

序列化XML

function serializeXml(xmldom) {
    if (typeof XMLSerializer != "undefined") {
        return (new XMLSerializer()).serializeToString(xmldom);
    } else if (typeof xmldom.xml != "undefined") {
        return xmldom.xml;
    } else {
        throw new Error("Could not serialize XML DOM.");
    }
}

JS菌
6.4k 声望2k 粉丝