加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

e4x解析xml

发布时间:2020-12-15 23:37:57 所属栏目:百科 来源:网络整理
导读:E4X 增加了 JavaScript 程序语言对 XML 的支持,XML 作为在应用程序和平台之间交换文档和数据的通用方法,得到了广泛认可。这种认可直接使 XML 成为解决共享文档和数据的互操作性问题的有效方法。XML 结构组件的灵活性促成了它强大丰富的功能。E4X 使 XML 的

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

充分利用本文的知识

本文讨论了 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 音乐对象
                
<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 对象
                
      var xmlMusic = new XML() ;

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


清单 3. 装载 XML 对象:方法 1
                
<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
                
<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)





回页首


访问数据

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

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


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

该语句的输出结果为:

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
                
document.write ( xmlMusic.music[2].artist );

该语句的输出结果为:

Johann Sebastian Bach

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

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


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

该语句的输出结果为:

Ludwig van Beethoven  Fifth Symphony 

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





回页首


访问属性

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


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

该语句的输出结果为:

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. 获取古典艺术家名字
                
document.write(xmlMusic.music.(@genre=="classical").artist );

Which outputs only the names:

Ludwig van Beethoven 
Johann Sebastian Bach
Johannes Brahms

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





回页首


添加子节点

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


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

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

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

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





回页首


改变子对象的内容

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


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

输出结果为:

Dave Brubeck 
Pick Up Sticks

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





回页首


删除子节点

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


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

输出结果为:

Grover Washington,Jr. 

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





回页首


过滤

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

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


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

过滤后的输出结果为:

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

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


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

过滤的输出结果为:

Take Five 
Truth Is Fallen

处理 XMLList

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

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

<music></music> 
<music></music>
<music></music>
<music></music>
<music></music>

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


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

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

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





回页首


执行计算

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


清单 16. 计算示例
                
<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 进行计算
                
<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>
 

该脚本的输出结果为:

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 对象可用的方法

XML 对象方法

可用于
XMLList 对象

XML 对象方法

可用于
XMLList 对象
addNamespace(namespace) name()
appendChild(child) namespace([prefix])
attribute(attributeName) namespaceDeclarations()
attributes() nodeKind()
child(propertyName) normalize()
childIndex() parent()
children() processingInstructions([name])
comments() prependChild(value)
contains(value) removeNamespace(namespace)
copy() replace(propertyName,value)
descendants([name]) setChildren(value)
elements([name]) setLocalName(name)
hasComplexContent() setName(name)
hasSimpleContent() setNamespace(ns)
inScopeNamespaces() text()
insertChildAfter(child1,child2) toString()
insertChildBefore(child1,child2) toXMLString()
length() valueOf()
localName()

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


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

该代码产生的输出结果为:

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

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

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


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

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

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

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


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

该代码产生的输出结果为:

  Dave Brubeck   
Take Five
Eleven Four
Truth Is Fallen

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


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

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

 classical  
jazz
classical
jazz
classical

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


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

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

该代码产生的输出结果为:

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

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





回页首


浏览器的兼容性

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读