【问题标题】:XML attribute parsing as XMLListXML 属性解析为 XMLList
【发布时间】:2011-08-28 11:52:21
【问题描述】:

在下面的代码块中,如果我调试并查看它显示为 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)
}

【问题讨论】:

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


    【解决方案1】:

    使用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】:

      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上的一篇好文章。

      干杯

      【讨论】:

      • 你知道我可以发誓我试过了。猜猜是时候称它为夜间活动了。您愿意解释一下为什么@atributeNAme 返回一个 XMLList 而不是人们期望的值吗?
      • 我一直发现铸造也是一种更简洁的做事方式。唯一担心的是初学者很难理解类型转换。
      • @the_asMan - @attribute 确实返回 value (或者更确切地说,AS3 解析器返回) - 但类型保持为 xml/list 直到明确转换。 @Marty - 我同意关于选角的观点。对于 as3 入门者来说,这很可能是一个令人困惑的话题。但是 - 这是一个如此重要的概念,通常是对这种情况的正确答案,我认为没有理由不加入;)
      【解决方案3】:

      这是 ActionScript 使用的 E4X 解析器的一部分。

      XML 元素的子节点总是包装在 XMLList 中。即使 an 元素只有一个子元素或属性。

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

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

      【讨论】:

      • 它不是一个子节点,它是一个属性。
      • 其实既然它有一个 XMLList 包装器,panel.@id[0] 不是更合适吗?
      • 如果它有属性,也将它包装在一个 XMLList 中。我还发现使用 toString() 可以使代码更具可读性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2010-11-02
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多