XML 跨浏览器

一、浏览器对XML DOM的支持
    1.判断浏览器对DOM2.0级别的XML的支持
        alert(document.implementation.hasFeature("XML", "2.0"));    // true
    2.解析XML
        // 在ie8以下创建XML
        function createXML() {
            if(typeof arguments.callee.activeXString != "string"){
                var versions = ["MSXML2.DOMDocument", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument.6.0"], i, len;
                for (i = 0, len = versions.length; i < len ; i++)
                {
                    try
                    {
                        new ActiveXObject(versions[i]);
                        arguments.callee.activeXString = versions[i];
                        break;
                    }
                    catch (error){}
                }
            }
            return new ActiveXObject(arguments.callee.activeXString);
        }
        // 解析XML字符串为XML DOM对象
        function parseXml (xml) {
            var xmlDom;
            if (typeof DOMParser != "undefined")
            {
                xmlDom = (new DOMParser()).parseFromString(xml, "text/xml");
                var errors = xmlDom.getElementsByTagName("parsererror");
                if(errors.length)
                {
                    throw new Error(errors[0].textContent);
                }
                //alert(xmlDom.documentElement.tagName);
            } else if (typeof ActiveXObject != "undefined")
            {
                xmlDom = new createXML();
                xmlDom.loadXML(xml);
                if (xmlDom.parseError != 0)
                {
                    throw new Error(xmlDom.parseError.reason);
                }
                //alert(xmlDom.xml);
            } else {
                throw new Error("不支持xml dom");
            }
            return xmlDom;
        }   
        // 测试
        var xmldom = null;
        try {
            xmldom = parseXml("");
        } catch (ex){
            alert(ex.message);
        }
        alert(xmldom);  
    3.序列化xml
        function serializeXml(xmldom){
            if (typeof XMLSerializer != "undefined"){
                return (new XMLSerializer()).serializeToString(xmldom);
            } else if (typeof xmldom.xml != "undefined"){
                // Less IE8
                return xmldom.xml;
            } else {
                throw new Error("Could not serialize XML DOM.");
            }
        }
        // 测试
        var xmldom = null;
        try {
            xmldom = parseXml("");
        } catch (ex){
            alert(ex.message);
        }
        var serizlize = serializeXml(xmldom);
        alert(serizlize);   // 
    4.加载xml文件
        function parseXmlFile(file) {
            try //Internet Explorer
              {
                xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
              }
            catch(e)
              {
                  try //Firefox, Mozilla, Opera, etc.
                    {
                    xmlDoc=document.implementation.createDocument("","",null);
                    }
                  catch(e) {alert(e.message)}
              }
            try 
              {
                  xmlDoc.async=false;
                  xmlDoc.load(file);
              }
            catch(e) {alert(e.message)}

            return xmlDoc;
        }
二、浏览器对XPATH的支持
    1.判断浏览器对DOM3的XPath的支持
        alert(document.implementation.hasFeature("XPath", "3.0"));  // true
    2.跨浏览器兼容
        /**根据
        * param context : XML DOM上下文环境
        * param expression : XPath的查询表达式
        * param namespaces : 命名空间
        */
        function selectNodes(context, expression, namespaces){
            var doc = (context.nodeType != 9 ? context.ownerDocument : context);
            if (typeof doc.evaluate != "undefined"){
                var nsresolver = null;
                if (namespaces instanceof Object){
                    nsresolver = function(prefix){
                        return namespaces[prefix];
                    };
                }
                var result = doc.evaluate(expression, context, nsresolver,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                var nodes = new Array();
                if (result !== null){
                    for (var i=0, len=result.snapshotLength; i < len; i++){
                        nodes.push(result.snapshotItem(i));
                    }
                }
                return nodes;
            } else if (typeof context.selectNodes != "undefined"){
                // 创建命名空间字符串
                if (namespaces instanceof Object){
                    var ns = "";
                    for (var prefix in namespaces){
                        if (namespaces.hasOwnProperty(prefix)){
                            ns += "xmlns:" + prefix + "='" + namespaces[prefix] + "' ";
                        }
                    }
                    doc.setProperty("SelectionNamespaces", ns);
                }
                var result = context.selectNodes(expression);
                var nodes = new Array();
                for (var i=0,len=result.length; i < len; i++){
                    nodes.push(result[i]);
                }
                return nodes;
            } else {
                throw new Error("No XPath engine found.");
            }
        }
        var xmldom = null;
        try {
            xmldom = parseXml("zhangshanlisi");
        } catch (ex){
            alert(ex.message);
        }
        var result = selectNodes(xmldom.documentElement, "yc:child",
        { yc: "http://www.yc.com/"});
        for(var i = 0, len = result.length; i < len; i++) {
            alert(result[i].firstChild.nodeValue);  // zhangshan,lisi
        }
三、浏览器对XLST的支持   将xml文件用xsl文件修饰,形成为html文件,html文件包括xml的内容和xsl的样式
    下面我们来讲一个例子,大体是用javascript操作xml文件和xsl文件,将他们合并为html形式的文件当然,
    我们返回的是html形式的字符串,以下是具体步骤:
    1.准备文件cdcatalog.xml和cdcatalog.xsl
        ①cdcatalog.xml文件:
        
        
        
            
                Empire Burlesque
                Bob Dylan
                USA
                Columbia
                10.90
                1985
            
            
                Hide your heart
                Bonnie Tyler
                UK
                CBS Records
                9.90
                1988
            
        
        ②cdcatalog.xsl文件:
        
        
        
        
        
          
          
          

My CD Collection

Title Artist
2.用javascript将两个文件加载,用上述的parseXmlFile函数 var xmldom = parseXmlFile("xml/cdcatalog.xml"); var xsltdom = parseXmlFile("xml/cdcatalog.xsl"); 3.将xml文件和xsl文件转换为字符串 function transform(context, xslt){ if (typeof XSLTProcessor != "undefined"){ // 创建XSLTProcessor对象 var processor = new XSLTProcessor(); // 导入xslt样式表 processor.importStylesheet(xslt); // 转化为文档 var result = processor.transformToDocument(context); // 序列化为字符串 return (new XMLSerializer()).serializeToString(result); } else if (typeof context.transformNode != "undefined") { return context.transformNode(xslt); } else { throw new Error("No XSLT processor available."); } } var result = transform(xmldom, xsltdom); alert(result); // html形式的字符串 4.接下来就是将result返回的字符串拷贝下来,放入一个html文件中就可以看到效果了。

你可能感兴趣的:(XML 跨浏览器)