不明白这个 E4X 行为

发布于 2024-11-02 00:27:26 字数 1317 浏览 3 评论 0原文

我试图获取特定节点的属性值,但被它的行为所困扰。

我在数据提供程序中有此 XML:

<items>
    <item>
        <code>ITEM1</code>
        <groups>
            <group>
                <code>GROUP1</code>
                <props>
                    <prop>
                        <code>PROP1</code>
                    </prop>
                    <prop>
                        <code>PROP2</code>
                    </prop>
                </props>
            </group>
        </groups>
    </item>
    <!-- Lots more items, each item has a variable number of groups and props -->
</items>

现在,此代码:

var itemData:XMLList = dataProvider..elements("item").(code == "ITEM1");

成功返回第一个

接下来,我这样做:

var groupData:XMLList = itemData..elements("group").(code == "GROUP1")

但这不起作用groupData.length() == 0

如果我删除 elements(),那么它就可以工作:

var groupData:XMLList = itemData..group.(code == "GROUP1")

但我需要使用 elements(),因为元素名称可能是可配置的。

那么问题来了,为什么第一条语句可以工作,但是对第一条语句返回的数据使用相同的语句却无法按预期工作?

任何帮助表示赞赏。提前致谢。

I'm trying to grab a property value of a particular node but getting stumped by its behaviour.

I have this XML in a data provider:

<items>
    <item>
        <code>ITEM1</code>
        <groups>
            <group>
                <code>GROUP1</code>
                <props>
                    <prop>
                        <code>PROP1</code>
                    </prop>
                    <prop>
                        <code>PROP2</code>
                    </prop>
                </props>
            </group>
        </groups>
    </item>
    <!-- Lots more items, each item has a variable number of groups and props -->
</items>

Now, this code:

var itemData:XMLList = dataProvider..elements("item").(code == "ITEM1");

successfully returns the 1st <item>.

Next, I do:

var groupData:XMLList = itemData..elements("group").(code == "GROUP1")

But that doesn't work. groupData.length() == 0

If I drop elements(), then it works:

var groupData:XMLList = itemData..group.(code == "GROUP1")

But I need to use elements() because element names are potentially configurable.

So the question is, why does the first statement work, but using the same statement on the data returned by the first statement failed to work as expected?

Any help appreciated. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

以可爱出名 2024-11-09 00:27:26

因为 groupgroups 的内部元素,而不是 item 的直接子元素
由于本质上是递归的,第二条语句正在工作

尝试以下代码,

var itemData:XMLList = xml..elements("item").(code == "ITEM1"); 
//Alert.show(itemData.toXMLString());
var groupsData:XMLList = itemData..elements("groups");              
//Alert.show(groupsData.toXMLString());
var groupData:XMLList = groupsData..elements("group").(code == "GROUP1")
//Alert.show(groupData.toXMLString());

您可以启用 Altert 查看表达式结果

编辑元素函数的详细信息可以在
AS3 XML 元素()

希望有帮助

Because group is inner element of groups and not direct child of item
and second statement is working because of recursive in nature

Try following code

var itemData:XMLList = xml..elements("item").(code == "ITEM1"); 
//Alert.show(itemData.toXMLString());
var groupsData:XMLList = itemData..elements("groups");              
//Alert.show(groupsData.toXMLString());
var groupData:XMLList = groupsData..elements("group").(code == "GROUP1")
//Alert.show(groupData.toXMLString());

you can enable Altert to see expression result

EDITED Details for element function can be found at
AS3 XML elements()

hopes that helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文