【问题标题】:How to include and use E4x to get XML values in FLex如何在 Flex 中包含和使用 E4x 获取 XML 值
【发布时间】:2015-08-16 04:51:13
【问题描述】:

我在 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。

提前致谢

【问题讨论】:

    标签: actionscript-3 apache-flex flex4 flex3 e4x


    【解决方案1】:

    首先,请注意您的访问权限URLLoader's data is a property,而不是method()。在 actionscript 3 中,与 java 不同的是,您可以拥有从 java 角度看类似于公共变量的 getter 和 setter,但它们确实在幕后调用函数。

    所以你的代码应该是这样的

    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 的有趣之处在于它内置在语言中,因此您不仅不需要库(编译为 .swc 的库是 .swc 文件,而不是 java .jar),而且您可以内联 xml,所以您想要测试一个快速的 sn-p,这将起作用:

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

    回到你的主要问题,访问rollNo,这个节点嵌套在&lt;Student/&gt;节点中(这是一个XMLList...你以后可能有多个Student节点),而后者又嵌套在里面&lt;Student/&gt; 节点:你的根节点。

    所以从上到下,xml.Student 将带您到&lt;Student/&gt; 子 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 在 actionscript 3 中有几个关于 XML 和 E4X 的易于学习的视频教程:

    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
    

    【讨论】:

    • 嗨,乔治,感谢您的回答,但是当我执行 xml.Student[0]
    • 我猜这在你的OnCompleteupload() 函数中,对吧?如果是这样,请先试试这个:trace(xml.toXMLString())。如果您在此处获得 null,则表示数据未正确转换为 XML 对象。如果您没有得到空值并看到实际的 XML 文档,请确保结构符合您的预期。你能发布更新的OnCompleteupload 函数和跟踪结果吗?
    • 是的,我可以在 xml.toSMLString() 之后看到 xml,这就是我在此之后得到的:
    • 20425
    • 请参阅上面的更新答案。请花时间阅读并理解所提供的文档/资源。如果有帮助,请投票和/或标记答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多