e4x解析xml

前端之家收集整理的这篇文章主要介绍了e4x解析xml前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

E4X 增加了 JavaScript 程序语言对 XML 的支持,XML 作为在应用程序和平台之间交换文档和数据的通用方法,得到了广泛认可。这种认可直接使 XML 成为解决共享文档和数据的互操作性问题的有效方法。XML 结构组件的灵活性促成了它强大丰富的功能。E4X 使 XML 的结构组件的使用更加方便,因此大大增加了灵活性。

@H_301_10@
充分利用本文的知识

本文讨论了 E4X 的基本原理,并加深了对已经熟悉的 XML 数据结构和 JavaScript 语言的理解。

E4X 的目的是简化编写 XML 的 JavaScript 代码,是一个与 XML 节点和属性交互的高效的、强大的工具。E4X 的主要目标是为 JavaScript 开发人员提供一种不依靠文档对象模型(Document Object Model,DOM)处理 XML 文档的简单高效的方法

JavaScript 语言使用 E4X 实用程序为全局对象传递新属性。反过来,XML 对象的很多属性在 E4X 的序列化和分析函数中是有用的。E4X 重用现有的 JavaScript 运算符(用于 XML 的创建、操作及导航)。

E4X 开发需要的时间很短,而且容易掌握。这些优点可以使读、写操作和相关运算变得简单高效。因此产生的简便性简化了代码编写,方便代码修改并且缩短了代码的部署周期。另外,灵活敏捷的 E4X 技术是为日益重要的移动应用程序量身定做的。

为了说明 E4X 的功能和灵活性,我将一个音乐目录作为主要输入源,描述处理 XML 数据所使用的主要特征。本文中的大多数的例子基于 清单 1 中的 XML 文档。


清单 1. 用于许多示例的 XML 音乐对象
@H_301_10@
                
<mp3>
   <music genre="classical">
      <artist>Ludwig van Beethoven</artist>
      <song>Fifth Symphony</song>
   </music>
   <music genre="jazz">
      <artist>Grover Washington,Jr.</artist>
      <song>The Best Is Yet to Come</song>
   </music>
   <music genre="classical">
      <artist>Johann Sebastian Bach</artist>
      <song>Double Concerto in D- for Two Violins</song>
   </music>
   <music genre="jazz">
      <artist>Dave Brubeck</artist>
      <song>Take Five</song>
      <song>Truth Is Fallen</song>
   </music>
   <music genre="classical">
      <artist>Johannes Brahms</artist>
      <song>Piano Sonata No. 1 in C major</song>
   </music>
</mp3>   

创建 XML 对象

这个过程的第一步是创建 XML 对象。E4X 提供了一种 XML() 类型,用来存储 XML 元素。在 清单 2 中,使用 JavaScript 开发人员熟悉的格式创建新的 XML 对象。


清单 2. 创建 XML 对象
@H_301_10@
                
      var xmlMusic = new XML() ;

XML 对象创建后,就能装载 XML 文档。E4X 有两个首选的方法来创建 XML 对象。第一种方法是创建 XML 对象,然后装载它。如 清单 3 所示。


清单 3. 装载 XML 对象:方法 1
@H_301_10@
                
<script type="text/javascript ; e4x=1">

   var xmlMusic=new XML() ;
   xmlMusic = <mp3>
      <music genre="classical">
         <artist>Ludwig van Beethoven</artist>
         <song>Fifth Symphony</song>
      </music>
      <music genre="jazz">
         <artist>Grover Washington,Jr.</artist>
         <song>The Best Is Yet to Come</song>
      </music>
      <music genre="classical">
         <artist>Johann Sebastian Bach</artist>
         <song>Double Concerto in D- for Two Violins</song>
      </music>
      <music genre="jazz">
         <artist>Dave Brubeck</artist>
         <song>Take Five</song>
         <song>Truth Is Fallen</song>
      </music>
      <music genre="classical">
         <artist>Johannes Brahms</artist>
         <song>Piano Sonata No. 1 in C major</song>
      </music>
   </mp3>

</script>

或者在创建 XML 后,将 XML 文档作为一个字符串载入到元素中。如 清单 4 所示。


清单 4. 装载 XML 对象:方法 2
@H_301_10@
                
<script type="text/javascript ; e4x=1">

   var xmlMusic=new XML('<mp3><music genre="classical">
              <artist>Ludwig van Beethoven</artist>
              <song>Fifth Symphony</song></music>
              <music genre="jazz"><artist>Grover Washington,Jr.</artist>
              <song>The Best Is Yet to Come</song>
              </music><music genre="classical">
        <artist>Johann Sebastian Bach</artist>
              <song>Double Concerto in D- for Two Violins</song></music>
              <music genre="jazz"><artist>Dave Brubeck</artist>
              <song>Take Five</song><song>Truth Is Fallen</song>
              </music><music genre="classical">
              <artist>Johannes Brahms</artist>
              <song>Piano Sonata No. 1 in C major</song>
              </music></mp3>');

</script>

注意,表达式 e4x=1添加script 语句中。E4X 广泛用于将 XML 解析到 JavaScript 对象中。不过,直接使用 XML 语法将会出现问题。如果嵌入到其他基于标记的环境中,会产生一些无法预料的问题。默认情况下,该问题导致 E4X 在火狐浏览器 1.5 版的 HTML 页面中不可用,因为在 HTML 中,它与公认的方法(取消来自不兼容浏览器的脚本)相冲突。为解决这一问题,使用 E4X 时,在表单 type="text/javascript; e4x=1"script 语句中部署一个属性

尽管 XML 对象表现形式和运行机制与常规 JavaScript 对象相似,但是,这两个对象并不相同。一些 E4X 语法只适用于 E4X XML 对象。JavaScript 开发人员对这些语法是熟悉的,但是 E4X 并不为 XML 到本地 JavaScript 对象的直接映像提供便利。相反,它提供了直接映像的假象(illusion)


@H_301_10@
@H_301_10@

回页首


访问数据

XML 对象支持在常规 JavaScript 编程中使用的小圆点(.)和方括号([])符号。E4X 并不访问对象属性,而是过载这些运算符,并通过它们访问子元素。

下面的访问例子以 上面 创建的 xmlMusic 对象为基础。要查看全部元素的内容,请使用 清单 5 中的语法。


清单 5. 查看全部元素的内容
@H_301_10@
                
document.write(xmlMusic);

该语句的输出结果为:

@H_301_10@
Ludwig van Beethoven   Fifth Symphony 
Grover Washington,Jr. The Best Is Yet to Come
Johann Sebastian Bach Double Concerto in D- for Two Violins
Dave Brubeck Take Five Truth Is Fallen
Johannes Brahms Piano Sonata No. 1 in C major

要查找第三个艺术家,输入与类似于 清单 6 的语句。


清单 6. 浏览艺术家 3
@H_301_10@
                
document.write ( xmlMusic.music[2].artist );

该语句的输出结果为:

@H_301_10@
Johann Sebastian Bach

注意:E4X 从 0 开始记数,因此获取第三个记录的索引值为 2

获取第一个音乐节点的所有内容,输入 清单 7 所示的语句。


清单 7. 获取第一个音乐节点
@H_301_10@
                
document.write (xmlMusic.music[0].*);

该语句的输出结果为:

@H_301_10@
Ludwig van Beethoven  Fifth Symphony 

从这些例子中可以看到,使用 E4X 访问 XML 节点是非常简单的。


@H_301_10@
@H_301_10@

回页首


访问属性

可以使用符号(@)访问 XML 对象的属性属性操作是处理 XML 数据中比较难掌握的部分之一。使用 E4X 可以大大简化这一任务。例如,要检索古典流派的所有数据,输入类似于 清单 8 的语句。


清单 8. 访问节点属性
@H_301_10@
                
document.write(xmlMusic.music.(@genre==”classical”) );

该语句的输出结果为:

@H_301_10@
Ludwig van Beethoven Fifth Symphony 
Johann Sebastian Bach Double Concerto in D- for Two Violins
Johannes Brahms Piano Sonata No. 1 in C major

获取古典流派中的艺术家名字,输入 清单 9 中的语句。


清单 9. 获取古典艺术家名字
@H_301_10@
                
document.write(xmlMusic.music.(@genre=="classical").artist );

Which outputs only the names:

@H_301_10@
Ludwig van Beethoven 
Johann Sebastian Bach
Johannes Brahms

在此,E4X 的强大功能、灵活性和简单易用得到了有力的证明。这样,不必再因属性难操作而避免使用它们了。可以很清楚地看到,E4X 能够轻松处理它们。


@H_301_10@
@H_301_10@

回页首


添加子节点

E4X 允许使用简单 JavaScript 符号为一个现有元素添加子元素。例如,如果想要为一个现有的艺术家添加一首歌曲 — 比如 Johann Sebastian Bach 的 Brandenburg Concertos — 使用 “+=” 运算符,如 清单 10 所示。


清单 10. 使用 += 运算符添加一个节点
@H_301_10@
                
xmlMusic.music[2].song += "Brandenburg concertos" ; 
document.write (xmlMusic.music[2]); 

添加节点后的输出结果为:

@H_301_10@
Johann Sebastian Bach 
Double Concerto in D- for Two Violins
Brandenburg Concertos

现在,Bach 作为 xmlMusic 对象的一部分,有两个作品,在该语句运行之前只有一个作品。


@H_301_10@
@H_301_10@

回页首


改变子对象的内容

要改变一个元素或属性的值,必须对其赋一个新值。如 清单 11 所示。


清单 11. 用 = 运算符修改一个节点
@H_301_10@
                
xmlMusic.music[3].song = "Pick Up Sticks" ;
document.write ( xmlMusic.music[3] ); 

输出结果为:

@H_301_10@
Dave Brubeck 
Pick Up Sticks

注意:因为使用等号(=)替换 xmlMusic.music[3].song内容,Dave Brubeck 的歌曲都被修改,只保留新内容


@H_301_10@
@H_301_10@

回页首


删除子节点

可以使用 delete 语句删除一个子节点,如 清单 12 所示。


清单12. 删除子节点
@H_301_10@
                
delete xmlMusic.music.song[1] ;
document.write (xmlMusic.music[1].*); 

输出结果为:

@H_301_10@
Grover Washington,Jr. 

歌曲节点被删除,艺术家节点仍然存在。


@H_301_10@
@H_301_10@

回页首


过滤

E4X 提供了一种特殊的过滤运算符(圆括号),用来选择文档中与特定标准匹配的节点。过滤运算符为数据设置一个条件,从子节点中选出需要的元素。过滤运算符通过用圆括号内的表达式执行。实际上,您已经见过这个运算符了,现在,正式介绍它。

例如,过滤一个属性,如 清单 13 所示。


清单13. 使用属性过滤数据
@H_301_10@
                
 document.write (xmlMusic.music.(@genre=="jazz") );

过滤后的输出结果为:

@H_301_10@
Grover Washington,Jr. The Best Is Yet to Come 
Dave Brubeck Take Five Truth Is Fallen

除了属性之外,还可以使用艺术家来过滤数据,如 清单 14 所示。


清单 14. 使用艺术家的名字查找歌曲
@H_301_10@
                
document.write (xmlMusic.music.(artist == "Dave Brubeck").song);

过滤的输出结果为:

@H_301_10@
Take Five 
Truth Is Fallen

处理 XMLList

E4X 识别两种基本类型:XML()XMLList()XMLList 对象表示 XML 属性的一个有序集合 — 比如,菜谱、大洲、电话号码以及化学元素的列表。由一个以上的节点组成的 E4X 实际上是 XML()XMLList() 对象的组合。XMLList 类型是一个快速查询的重要工具 — 例如,当查找一个给定节点的子节点时,便可生成一个 XMLList

下面的代码概括了 XMLList 的框架,它是基于音乐的示例,包括多个节点:

@H_301_10@
<music></music> 
<music></music>
<music></music>
<music></music>
<music></music>

XMLList 对象有一个初始化程序,它是一个描述 XMLList 对象初始化的表达式。 XMLList 初始化程序描述了 XML 属性的结构列表,并使用了匿名的 XML 元素语法。初始化程序以 <> 字符开始,以 </> 字符结束。清单 15 中的代码序列阐明了初始化 XMLList 对象的方法


清单 15. 初始化 XMLList 对象
@H_301_10@
                
var xmlListObject = 
     <><artist>Ludwig van Beethoven</artist> <song>Fifth Symphony</song></>; 

那么,XML 对象和 XMLList 对象之间有什么不同呢?本质上的差别是 XML 类型处理一种包含多个子节点的特定对象,XMLList 处理一个包含多个 XML 对象的集合。

E4X 刻意去区别 XML 对象和 XMLList 对象,但这一项几乎不可能完成。因此,XML 值与 XMLList 值之间若有区别也是可以忽略的。


@H_301_10@
@H_301_10@

回页首


执行计算

可以像在 XML 中一样,使用 E4X 对 XML 数据执行计算。例如,可以对一个新的 XML 文档中的数据进行数学运算。XML 文档如 清单 16 所示。


清单 16. 计算示例
@H_301_10@
                
<script type="text/javascript ; e4x=1">
 
   var xmlCatalog=new XML() ;
   xmlCatalog=<inventory>
      <item genre="apparel">
         <description>Dress</description>
         <price>50.00</price>
         <quantity>3</quantity>
      </item>
      <item genre="accessory">
         <description>Hat.</description>
         <price>25.00</price>
         <quantity>5</quantity>
      </item>
      <item genre="apparel">
         <description>tie</description>
         <price>15.00</price>
         <quantity>7</quantity>
      </item>
      <item genre="accessory">
         <description>Belt</description>
         <price>15.00</price>
         <quantity>1</quantity>
      </item>
      <item genre="apparel">
         <description>Suit</description>
         <price>100.00</price>
         <quantity>2</quantity>
      </item>
   </inventory>

</script> 

这里给出计算数据的脚本。使用 while 循环语句,计算库存的总值和仓库中现有项目的总量。清单 17 使用 length() 方法确定 XML 对象的大小和控制循环。


清单 17. 使用 E4X 进行计算
@H_301_10@
                
<script type="text/javascript ; e4x=1">

   var i = 0 ;
   var totItems=0 ;
   var totInventoryValue=0 ;

   while ( i < xmlCatalog.item.length()  )
     {
       totInventoryValue  += xmlCatalog.item[i].quantity *
       xmlCatalog.item[i].price ;
       totItems+= xmlCatalog.item[i].quantity * 1 ;
       i = i + 1 ;
     }
  
   document.write ("Total number of items: " + totItems + "<p>");  
   document.write ("Total inventory value: $" + totInventoryValue + "<p>");

</script>
 

该脚本的输出结果为:

@H_301_10@
Total number of items: 18 
Total inventory value: $595

使用 XMLObject 方法

E4X 提供了一组计算 XML 对象和 XMLList 对象的方法,从 清单 17 中已经看到如何在脚本中用 length() 方法来控制流程。E4X 方法可以完成很多任务,包括标识属性名称空间以及添加和标识子元素等。

前面提到过,E4X 用一个大小值来消除 XML 对象和 XMLList 对象之间的区别。因此,在 E4X 中,可供 XML 对象使用的方法对有适当大小的 XMLList 对象也适用。

表 1 列出了 XML 对象和 XMLList 对象可用的方法。所有列出的方法都可用于 XML 对象,所有含 “” 的方法可用于 XML 对象和 XMLList 对象。


表1. XML 和 XMLList 对象可用的方法
@H_301_10@

XML 对象方法

@H_301_10@name() @H_301_10@否 @H_301_10@namespace([prefix]) @H_301_10@否 @H_301_10@namespaceDeclarations() @H_301_10@否 @H_301_10@nodeKind() @H_301_10@否 @H_301_10@normalize() @H_301_10@是 @H_301_10@parent() @H_301_10@是 @H_301_10@processingInstructions([name]) @H_301_10@是 @H_301_10@prependChild(value) @H_301_10@否 @H_301_10@removeNamespace(namespace) @H_301_10@否 @H_301_10@replace(propertyName,value) @H_301_10@否 @H_301_10@setChildren(value) @H_301_10@否 @H_301_10@setLocalName(name) @H_301_10@否 @H_301_10@setName(name) @H_301_10@否 @H_301_10@setNamespace(ns) @H_301_10@否 @H_301_10@text() @H_301_10@是 @H_301_10@toString() @H_301_10@是 @H_301_10@toXMLString() @H_301_10@是 @H_301_10@valueOf() @H_301_10@是 @H_301_10@ @H_301_10@

XML 对象方法

可用于
XMLList 对象
可用于
XMLList 对象
addNamespace(namespace)
appendChild(child)
attribute(attributeName)
attributes()
child(propertyName)
childIndex()
children()
comments()
contains(value)
copy()
descendants([name])
elements([name])
hasComplexContent()
hasSimpleContent()
inScopeNamespaces()
insertChildAfter(child1,child2)
insertChildBefore(child1,child2)
length()
localName()

清单 10 中,采用 += 运算符为 xmlMusic 对象添加一个歌曲节点,使用 appendChild() 方法可得到相同的输出结果。使用 appendChild() 方法,可以在现有对象或元素末尾添加一个节点。为演示这一功能清单 18 重复清单 10 中执行的处理过程,但使用 appendChild() 方法代替 += 运算符。


清单 18. 使用 appendChild() 方法添加一个节点
@H_301_10@
                
xmlMusic.music[2].appendChild(<song>Brandenburg Concertos</song>) ; 
document.write (xmlMusic.music[2].*); 

代码产生的输出结果为:

@H_301_10@
 Johann Sebastian Bach  
Double Concerto in D- for Two Violins
Brandenburg Concertos

可以看到,输出结果显示XMLList 对象的第三个元素中添加歌曲,和清单 10 中的代码的结果相同。

还可以用 prependChild() 方法添加节点。prependChild() 方法在指定元素的子节点之前添加一个节点。例如,同样使用 Bach 的协奏曲 Brandenburg Concertos,使用 prependChild() 方法清单 19 中的代码将作品放在当前歌曲列表的前面,而不是后面。


清单 19. 使用 prependChild() 方法添加一个节点
@H_301_10@
                
xmlMusic.music[2].song[0].prependChild(<song>Brandenburg Concertos</song>) ;
document.write (xmlMusic.music[2].*);

结果显示协奏曲已经插入到最初歌曲节点的前面:

@H_301_10@
 Johann Sebastian Bach  
Brandenburg Concertos
Double Concerto in D- for Two Violins

使用 insertBefore() 方法,可以在两个现有节点之间插入一个节点。清单 20 处理包含两首歌曲的 Dave Brubeck 数据,使用 insertBefore() 方法可以将歌曲 “Eleven Four” 置于当前两个节点之间。


清单 20. 使用 insertBefore() 方法添加一个节点
@H_301_10@
                
xmlMusic.music[3].insertChildBefore(xmlMusic.music[3].song[1],<song>Eleven Four</song>);
document.write (xmlMusic.music[3].*);

代码产生的输出结果为:

@H_301_10@
  Dave Brubeck   
Take Five
Eleven Four
Truth Is Fallen

可以使用另外一种方法 attributes() 来确定一个对象中的属性。例如,使用 清单 21 中的代码,列出 xmlMusic 对象的所有属性


清单 21. 使用 attribute() 方法确定属性
@H_301_10@
                
document.write (xmlMusic.music.attributes());

方法生成 xmlMusic 对象包含的所有属性的列表:

@H_301_10@
 classical  
jazz
classical
jazz
classical

可以使用 attributes() 确定 jazz 风格的所有元素。借助 length() 方法清单 22 中的代码显示jazz 属性的所有节点。


清单 22. 确定含 jazz 属性的元素
@H_301_10@
                
   var i = 0 ;

   while ( i < xmlMusic.music.length()  )
     {
       if ( xmlMusic.music[i].attributes() == "jazz"  ) {
    document.write (xmlMusic.music[i].* + "<p>");
    }
       i = i + 1 ;
     }

代码产生的输出结果为:

@H_301_10@
Grover Washington,Jr. The Best Is Yet to Come 
Dave Brubeck Take Five Truth Is Fallen

E4X 中的方法(如运算符)提供了一种处理 XML 数据的简单机制。


@H_301_10@
@H_301_10@

回页首


浏览器的兼容性

E4X 是最为简单易用的处理 XML 数据的方法之一。然而,并不是所有的浏览器都支持 E4X。目前,Windows® Internet Explorer® 不支持它.但是火狐浏览器和所有基于开源 Rhino JavaScript 技术的系统都支持 E4X。

猜你在找的XML相关文章