如何在 FLex 中包含和使用 E4x 获取 XML 值

How to include and use E4x to get XML values in FLex

我在 UploadCompleteData() 中收到来自 servlet 的 xml 响应,我需要在 flex 中使用 E4x 获取 XML 的值。 我的代码如下:

//我们得到的函数 xml

function OnCompleteupload(event:Event):void
{
  xml:XML = event.event.currentTarget.data(); // this will give me the Xml 
 //here I need to get the values from xml using E4x
}

// XML 响应类似于

<Students>
  <Student>
      <rollNo>50</rollNo>
      <totalMarks>100</totalMarks>
  </Student>
</Students>

我需要获得类似于 xml[0].rollNo 的值。我是初学者,所以请提供一些建议,并告诉我是否需要将任何 jar 包含在我的项目中才能使用 E4X。

提前致谢

首先,请注意您的访问 URLLoader's data is a property,而不是 method()。在 actionscript 3 中,与 java 不同,您可以拥有 getter 和从 java 角度看起来像 public 变量的设置器,但它们确实在幕后调用函数。

所以你的代码应该是

function OnCompleteupload(event:Event):void
{
  xml:XML = new XML(event.event.currentTarget.data); // this will give me the Xml 
 //here I need to get the values from xml using E4x
}

E4X 的有趣之处在于它内置于语言中,因此您不仅不需要库(编译的 as3 库是 .swc 文件,而不是 java .jar),而且您可以内联xml,所以你想测试一个快速片段,这会起作用:

var xml:XML = <Students>
  <Student>
      <rollNo>50</rollNo>
      <totalMarks>100</totalMarks>
  </Student>
</Students>;

回到你的主要问题,访问rollNo,这个节点嵌套在<Student/>节点(这是一个XMLList...你以后可能有多个学生节点),它又嵌套在 <Student/> 节点内:您的根节点。

所以从上到下,xml.Student 将带您到 <Student/> 子 XMLList,您可以从中访问第一个元素,使用数组访问符号:xml.Student[0]。此时,您再向下钻取一层到 rollNo 节点:

var xml:XML = <Students>
  <Student>
      <rollNo>50</rollNo>
      <totalMarks>100</totalMarks>
  </Student>
</Students>;

trace(xml.Student[0].rollNo);//prints 50 to the console/output

如果您想了解更多信息,Lee Brimelow 提供了一些关于 XML 和 E4X in actionscript 3 的简单易懂的视频教程:

  1. ActionScript 3 XML Basics
  2. ActionScript 3 Advanced XML

更新 根据您的评论,您正在处理 XML Namespaces。上面的 ActionScript 3 Advanced XML 教程也涵盖了这一点。

你可以这样做:

var ns:Namespace = new Namespace("urn:xxx:proj:ken");
var xml:XML = <Students xmlns="urn:xxx:proj:ken"> <Student> <rollNo>20</rollNo> <totalMarks>425</totalMarks> </Student> </Students>;
//access via namespace
trace(xml.ns::Student[0].ns::rollNo);

这可能会有点冗长,但如果您在同一文档中有更多 XML 个名称空间,它会很灵活。

如果您的 XML 仅使用这一个命名空间,您可以将其设置为默认的 XML 命名空间:

var ns:Namespace = new Namespace("urn:xxx:proj:ken");
default xml namespace = ns;
var xml:XML = <Students xmlns="urn:xxx:proj:ken"> <Student> <rollNo>20</rollNo> <totalMarks>425</totalMarks> </Student> </Students>;
trace(xml.Student[0].rollNo);//notice you don't need to use ns:: before accessing each node as the default xml namespace is set above