【问题标题】:How many levels deep is the e4x implementation using square bracket array access notation in AS3?在 AS3 中使用方括号数组访问表示法的 e4x 实现有多少层?
【发布时间】:2011-08-21 04:59:24
【问题描述】:

使用括号表示法,我可以使用以下代码按名称或属性访问直接子节点:

示例 XML:

<item name="item1">
   <categories name="catList">
      <category name="cat1">
   </categories>
</item>

访问直接子节点的示例:

trace(xml["categories"].toString()); // <categories><category/></categories> 

访问节点属性示例:

trace(xml["@name"].toString()); // item1

更新:有没有办法使用单个方括号符号来访问子元素/嵌套元素/嵌套属性?

例如,

trace(xml["categories.category.@name"].toString()); // cat1

trace(xml["categories.@name"]); // catList

【问题讨论】:

  • 你应该好好阅读官方文档中的XML 类。您想知道的一切都在那里,并且加载了示例代码。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
  • 谢谢。我非常了解 E4X。如果该文档中回答了这个问题,我还没有找到它。
  • @TheDarkIn 感谢您的链接,它让我了解了很有帮助的 ECMA e4x 规范

标签: xml apache-flex actionscript-3 e4x


【解决方案1】:

如果您知道要访问的节点的名称,则无需使用方括号表示法。这应该可以正常工作:

xml.categories.category.@name.toString();

方括号表示法用于访问具有字符串名称的属性。它与 E4X 没有特别的关系。将所有属性转换为方括号表示法是这样的:

xml['categories']['category']['@name']['toString']();

【讨论】:

  • 谢谢。不幸的是,代码在 Flex SDK 中被硬编码为 sa = _name == null ? a.toString() : a[_name].toString();所以我希望只使用一个括号来钻取节点。
  • 所以这段代码是某种数据绑定代码?将数据转换为与此对象的绑定方式更兼容的格式可能会更好。
  • 是的……有点。我有一个可以传入的字符串,但必须访问比第一级更深的节点。代码“a[_name]”只给我一个选择。
【解决方案2】:

你可以这样做:

xml["categories"]["category"][0]["@name"].toString();

XML 类实现了一个类似Proxy 的接口。动态属性在使用时会动态解析,这就是为什么您可以调用未在 XML 类上显式定义的属性的原因。但是,如果您正在做一些动态 XML 名称的工作,并且需要对字符串使用方括号表示法,那么您肯定可以这样做。您只需将每个包裹在自己的 [ ] 中。

但是,可能有些事情可以用 e4x 表示法做,而用 [ ] 做不到。即做这样的事情:

xml..@name

这将在整个 xml 树中找到所有名称属性。我认为没有其他方式可以表示这一点。

【讨论】:

  • 谢谢。与上一条评论相同,代码在 Flex SDK 中被硬编码为 sa = _name == null ? a.toString() : a[_name].toString();所以我希望只使用一个括号来钻取节点。
【解决方案3】:

根据您对其他答案的 cmets,似乎这种相当不幸的 e4x 使用在 Flex SDK 中很深,您无法更改。在那种情况下,我不得不说我很抱歉,但你很可能不走运。当然,除非您拥有“a”变量并且可以将其传递,在这种情况下,您可以预先进行选择并将适当的 xml 片段传递给您正在调用的任何函数。

出于好奇(并且为了可能给出更好的答案),这是在 Flex SDK 中的什么位置?


我根据您的 cmets 查看了 SortField,虽然滥用 xmlCompare 方法的内部结构看起来确实很麻烦(而且有些危险),但您应该能够通过提供自定义 compareFunction 来解决它。

【讨论】:

  • 是的。它在 SortField xmlCompare 函数中。
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多