资讯专栏INFORMATION COLUMN

JS学习笔记(第18章)(JavaScript与XML)

GT / 947人阅读

摘要:函数接收三个参数上下文节点表达式和可选的命名空间对象。命名空间对象应该是下面这种字面量的形式。使用样式表转换文档跨浏览器使用这个函数接收两个参数要执行转换的上下文节点和文档对象。

本章主要讲解了以下四个问题:

1、将XML解析为DOM文档

跨浏览器把XML解析为DOM文档:

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){
                    throw new Error("XML parsing error:" + errors[0].textContent);
                }        
            } else if (typeof ActiveXObject != "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;
        }
  

这个 parseXml()函数只接收一个参数,即可解析的 XML 字符串。

2、将DOM文档序列化为XML文档

跨浏览器将DOM文档序列化为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.");
            }
        }

这个 serializeXml()函数接收一个参数,即要序列化的 XML DOM 文档。

3、XPath

跨浏览器使用XPath:
重新创建 selectSingleNode()和selectNodes()方法。函数接收三个参数:上下文节点、 XPath表达式和可选的命名空间对象。命名空间对象应该是下面这种字面量的形式。

{
    prefix1: "uri1",
    prefix2: "uri2",
    prefix3: "uri3"
}
 function selectSingleNode(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.FIRST_ORDERED_NODE_TYPE,null);
                return (result !== null ? result.singleNodeValue : null);
            
            } else if (typeof context.selectSingleNode != "undefined"){

                //create namespace string
                if (namespaces instanceof Object){
                    var ns = "";
                    for (var prefix in namespaces){
                        if (namespaces.hasOwnProperty(prefix)){
                            ns += "xmlns:" + prefix + "="" + namespaces[prefix] + "" ";
                        }
                    }
                    doc.setProperty("SelectionNamespaces", ns);
                }
                return context.selectSingleNode(expression);
            } else {
                throw new Error("No XPath engine found.");
            }
        }
        
var result = selectSingleNode(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" });            
alert(serializeXml(result));
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"){

                //create namespace string
                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 result = selectNodes(xmldom.documentElement, "wrox:book/wrox:author", { wrox: "http://www.wrox.com/" });            
alert(result.length); 
4、使用XSLT样式表转换XML文档

跨浏览器使用XSLT:

function transform(context, xslt){
                if (typeof XSLTProcessor != "undefined"){
                    var processor = new XSLTProcessor();
                    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.");
                }
            }

这个 transform()函数接收两个参数:要执行转换的上下文节点和 XSLT 文档对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106137.html

相关文章

  • 《Head First JavaScript》读书笔记

    摘要:设定的值的时候,即已自动暗示类型。第五章循环自我重复的风险数组用于在单一场所存储多段数据数组的页码称为键,索引只是一种形式特殊的键,它是数值键存储在数组里的数据不一定为相同类型并不要求二维数组具有相同的行数,但是最好保持一致。 ** 简介 **书名:《Head First JavaScript》中文译名:《深入浅出JavaScript》著:Michael Morrison编译:O’R...

    ztyzz 评论0 收藏0
  • JS学习笔记19)(E4X)

    摘要:的类型类型创建对象的方法调用构造函数使用字面量将数据直接指定给一个变量。表示解析器应该忽略标记中的处理指令。这三个设置会影响对传入到构造函数中的字符串以及字面量的解析。 showImg(https://segmentfault.com/img/bVbvHVV?w=737&h=593); 1、E4X的类型 1.1 XML类型 1、创建XML对象的方法: (1)调用构造函数: var x ...

    lijinke666 评论0 收藏0
  • AjaxComet-JavaScript高级程序设计21读书笔记(1)

    摘要:技术的核心是对象即。收到响应后,响应的数据会自动填充对象的属性,相关的属性有作为响应主体被返回的文本。收到响应后,一般来说,会先判断是否为,这是此次请求成功的标志。中的版本会将设置为,而中原生的则会将规范化为。会在取得时报告的值为。 Ajax(Asynchronous Javascript + XML)技术的核心是XMLHttpRequest对象,即: XHR。虽然名字中包含XML,但...

    imingyu 评论0 收藏0
  • JS学习笔记10)(DOM之节点层次)

    摘要:节点层次是针对和文档的一个。每一段标记都可以通过一个节点来表示。用于表明节点的类型。返回新增的这个节点。将节点插入到节点列表指定的位置。节点有以下的特性为,为指向元素,指向元素。提供了对元素的标签名,子节点和特性的访问。   节点层次 DOM是针对HTML和XML文档的一个API。DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。 DOM可以将任何HTML或X...

    kamushin233 评论0 收藏0
  • 高程3总结#18JavaScriptXML

    摘要:在基于使用命名空间的文档求值时,需要使用对象。第四个参数的取值类型是下列常量之一,返回与表达式匹配的数据类型。,返回字符串值。这是最常用的结果类型。集合中节点的次序与它们在文档中的次序一致。 JavaScript与XML 浏览器对XML DOM的支持 DOM2级核心 在通过JavaScript处理XML时,通常只使用参数root,因为这个参数指定的是XML DOM文档元素的标签名 v...

    gaosboy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<