XML属性解析为XMLList

时间:2011-05-19 00:29:07

标签: flash flex actionscript-3 flash-cs4 e4x

在下面的代码块中,如果我调试并查看它显示为XMLList的var obj.theID。即使代码跟踪正确,我觉得它应该是一个字符串而不是XMLList
所以我的问题是如何让它分配字符串而不是XMLList?

var myXML:XML = new XML(
<panels>
  <panel id="1"/>
  <panel id="2"/>
  <panel id="3"/>
</panels>
);

var panels:XMLList = new XMLList( myXML.children());

trace( panels.length()); // is as expected
for each( var panel:XML in (new XMLList( myXML.children())) ){
    var obj:Object = new Object( );

    // XMLList is assigned here but why? and how can I make it a string?
    obj.theID = panel.@id;

    // id is traced as expected but apparently it is just converting the XMLlist to a string.
    trace( panel.@id)
}

3 个答案:

答案 0 :(得分:5)

AS3 xml解析器只读取任何本机xml内容,将属性或节点数据作为字符串读取,并且可以在没有类型转换的情况下使用。这是使xml在flash中如此方便的事情之一。但是如果你检查类型,它将作为XML返回,除非你专门强制转换它(这实际上是toString()的作用)。

    for each( var panel:XML in panels ){
    var obj:Object = new Object( );

    obj.theID = panel.@id;

    // the native type is xml, tho can be read without conversion as a string 
    trace( typeof obj.theID) // type:xml
    trace( typeof panel.@id) // type:xml

    // simply cast it to string
    obj.theIDString = String(panel.@id); 
    trace( typeof obj.theIDString) // type:string
}

- 更新 -

值得注意的是= XML和XMLlist 可以并且经常互换使用。他们每个人都可以使用类似的方法,但有一个重要的区别。 XML可能只有一个根节点,而XMLlist可能有几个。这在正常使用中可能没什么区别,但是根据传入的xml的结构,可能是一个关键的区别。通常,我只使用XML类型。这是一篇关于xml vs xmllist的好文章。

干杯

答案 1 :(得分:3)

使用toString()获取值。

示例:

var xml:XML = <thing>hello</thing>;

trace(xml.toString()) //hello

您的新代码:

var myXML:XML =
<panels>
    <panel id="1" />
    <panel id="2" />
    <panel id="3" />
</panels>;

var panels:XMLList = myXML.children();

var panel:XML;
for each(panel in panels)
{
    var obj:Object =
    {
        stringID: panel.@id.toString(),
        normalID: panel.@id
    };

    trace(typeof(obj.stringID), obj.stringID); //string
    trace(typeof(obj.normalID), obj.normalID); //xml
}

答案 2 :(得分:1)

这是ActionScript使用的E4X Parser的一部分。

XML元素的子节点始终包含在XMLList中。即使an元素只有一个子元素或属性。

在对象上获取字符串的最简单方法是使用

var obj:Object = new Object(); obj.theID = panel。@ id.toString();