E4X本身不是一门语言,它只是ECMAScript语言的可选扩展。就其本身而言,E4X为处理XML定义了新的语法,也定义了特定于XML的对象。

E4X的类型

XML类型

XML类型可以用来表现XML结构中任何独立的部分。XML的实例可以表现元素、特性、注释、处理指令或文本节点。XML类型继承自object类型,因此它也继承了所有对象默认的所有属性和方法。创建XML对象的方法有如下几种:

调用构造函数:创建一个空的XML对象。

var x = new XML();

也可以传入数据:

var x = new XML("<employee position=\"Software Engineer\"><name>Nicholas "+"Zakas</name></employee>");

使用这些方法,我们可以使用XML字面量将XML数据直接指定给一个变量。

var employee = <employee position="Software Engineer">

    <name>Nicholas C. Zakas</name>

</employee>;

XMLList

XMLList类型表现XML对象的有序集合。XMLList的DOM对等类型是NodeList,但与Node和NodeList之间的区别相比,XML和XMLList之间的区别是有意设计得比较小的。要显式的创建一个XMLList对象,像下面这样使用XMLList构造函数:

var list = new XMLList("<item/><item/>");

还可以使用加号(+)操作符来组合两个或多个XML对象,从而创建XMLList对象。

var list = <item/>+<item/>;

Namespace

E4X中使用Namespace对象来表现命名空间。通常用来映射命名空间前缀和命名空间URI的。通常这样创建Namespace对象:

var ns = new Namespace();

而传入URI或前缀加URI,就可以初始化Namespace对象。

var ns = new Namespace("http://www.wrox.com/");

var wrox = new Namespace("wrox", "http://www.wrox.com/");

可以使用prefix和uri属性来取得Namespace对象中的信息:

alert(ns.uri); //"http://www.wrox.com/"

alert(ns.prefix); //undefined

alert(wrox.uri); //"http://www.wrox.com/"

alert(wrox.prefix); //"wrox"

QName

QName类型表现的是XML对象的限定名,即命名空间与内部名称的组合。向QName构造函数中传入名称或Namespace对象和名字,可以手动创建新的QName对象,如下所示:

var wrox = new Namespace("wrox", "http://www.wrox.com/");

var wroxMessage = new QName(wrox, "message");

//表示"wrox:message"

创建了QName对象之后,可以访问它的两个属性:uri和localName。

alert(wroxMessage.uri);   //"http://www.wrox.com/"

alert(wroxMessage.localName);   //"message"

一般用法

如果子元素只包含文本,则相应的属性只返回文本:

var employee = <employee position="Software Engineer">

    <name>Nicholas C. Zakas</name>

</employee>;

alert(employee.name); //"Nicholas C. Zakas"

children()方法始终返回所以子元素。

var allChildren = employees.children();

还有一个elements()的行为与child()类似,只是它返回表示元素的XML对象。

var employeeList = employees.elements("employee"); //employees.employee 

var allChildren = employees.elements("*"); //employees.*相同

删除子元素

delete employees.employee[0];

alert(employees.employee.length());     //1

访问特性

访问特性也可以使用点语法,不过其语法稍有扩充。为了区分特性名与子元素的标签名,必须在名称前面加上一个@字符。

var employees = <employees>

    <employee position="Software Engineer">

        <name>Nicholas C. Zakas</name>

    </employee>

    <employee position="Salesperson">

        <name>Jim Smith</name>

    </employee>

</employees>;

alert(employees.employee[0].<a href="http://www.twitter.com/position">@position</a>); //"Software Engineer"

也可以child()方法来访问特性,只要传入带有@前缀的特性的名称即可。

alert(employees.employee[0].child("<a href="http://www.twitter.com/position">@position</a>")); //"Software Engineer"

还可以使用attribute()方法并传入特性名。

alert(employees.employee[0].attribute("position")); //"Software Engineer"

其他节点类型

使用下面这样设置XML构造函数的下列两个属性。

XML.ignoreComments = false;

XML.ignoreProcessingInstructions = false;

设置了这两种属性之后,E4X就会将注释和处理指令解析到XML结构中。

使用nodeKind()方法可以得到XML对象表示的类型,该访问可能会返回“text”、“element”、“comment”、“processing-instruction”、“attribute”。

查询

使用下面的代码可以访问所有的后代节点

var allDescendants = employees..*; //<employees/>的所有后代节点

构建和操作XML

将XML数据转换成XML对象的方式有很多种,XML字面量方式更方便一些,因为可以在字面量中嵌入javascript变量,语法是使用花括号({})。

var tagName = "color"; 18 var color = "red";

var xml = <{tagName}>{color}</{tagName}>;

alert(xml.toXMLString());     //"<color>red</color>

XML字面量的标签名和文本值都是使用花括号语法插入的。有了这个语法,就可以省去在构建XML结构时拼接字符串的麻烦。

使用加号操作可以再添加一个employee元素。

employees.employee += <employee position="Salesperson">

    <name>Jim Smith</name>

</employee>;

结果是:

<employees>

    <employee position="Software Engineer">

        <name>Nicholas C. Zakas</name>

    </employee>

    <employee position="Salesperson">

        <name>Jim Smith</name>

    </employee>

</employees>

其他变化

为了与ECMAScript做到无缝集成,E4X也对语言基础进行了一些修改,其中之一就是引入了for-each-in循环,以便迭代遍历每一个属性并返回属性的值。

var employees = <employees>

    <employee position="Software Engineer">

        <name>Nicholas C. Zakas</name>

    </employee>

    <employee position="Salesperson">

        <name>Jim Smith</name>

</employee>

</employees>;

for each (var child in employees){

    alert(child.toXMLString());

}

在这个例子中for-each-in循环,employee的每个子节点会依次被赋值child变量,其中包括注释、处理指令和/或文本节点。要想要返回特性节点,则需要对一个由特性节点组成的XMLList对象进行操作。

or each (var attribute in employees.@*){ //alert(attribute);

}

对应数组,for-each-in循环会返回每一项。

E4X还有一个全局函数,叫做isXMLName()。这个函数接受一个字符串,并在这个字符串是元素或特性的有效内部名称的情况下返回true。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

触发修改文章时间【fastadmincms开发记录】|fastadmincms二次开发,触发,修改,文章,时间,fastadmin,ms,开发,记录
触发修改文章时间【fastadmincms开发记录】
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】|fastadmincms二次开发,在tp5中,过滤,输入,的零,宽度,字符,fastadmin,ms,开发,记录
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】
处理tag标签中的0宽空格【fastadmincms开发记录】|fastadmincms二次开发,处理,tag,标签,中的,0宽,空格,fastadmin,ms,开发,记录
处理tag标签中的0宽空格【fastadmincms开发记录】
添加专题时tags标签id出错【fastadmincms开发记录】|fastadmincms二次开发,添加,专题,时tags,标签,id,出错,fastadmin,ms,开发,记录
添加专题时tags标签id出错【fastadmincms开发记录】
20230518----模板 广告【fastadmincms开发记录】|fastadmincms二次开发,20230518,模板,广告,fastadmin,ms,开发,记录
20230518----模板 广告【fastadmincms开发记录】
cms添加视频模型【fastadmincms开发记录】|fastadmincms二次开发,ms,添加,视频,模型,fastadmin,开发,记录
cms添加视频模型【fastadmincms开发记录】
新增单篇收费复制功能【fastadmincms开发记录】|fastadmincms二次开发,新增,单篇,收费,复制,功能,fastadmin,ms,开发,记录
新增单篇收费复制功能【fastadmincms开发记录】
添加开会员折扣功能【fastadmincms开发记录】|fastadmincms二次开发,添加,开会,折扣,功能,fastadmin,ms,开发,记录
添加开会员折扣功能【fastadmincms开发记录】

历史上的今天:05月02日

热门专题

小程序开发|微信小程序,小程序开发,小程序,小程序制作,微信小程序开发,小程序公司,小程序开发公司,分销,三级分销系统,分销系统
小程序开发
卓越综合高中|卓越综合高中
卓越综合高中
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校
综合高中|云南综合高中,昆明综合高中,综合高中能考本一吗,综合高中和普通高中的区别,综合高中是什么意思,综合高中能参加全国统一高考吗,综合高中可以考哪些大学,综合高中的学籍是什么
综合高中
云南综合高中|云南综合高中
云南综合高中
云南开放大学|云南开放大学报名,云南开放大学报考,云南开放大学,什么是云南开放大学,云南开放大学学历,云南开放大学学费,云南开放大学报名条件,云南开放大学报名时间,云南开放大学学历,云南开放大学专业
云南开放大学

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部