Атрибут XML разбирается как XMLList - PullRequest
0 голосов
/ 19 мая 2011

В следующем блоке кода, если я отлаживаю и смотрю на переменную obj.theID, она отображается как XMLList.Хотя код отслеживается правильно, я чувствую, что это должна быть строка, а не 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 ]

5 голосов
/ 19 мая 2011

Анализатор XML AS3 просто считывает любое собственное содержимое XML, либо атрибут, либо данные узла, в виде строки и может использоваться как таковой без преобразования типов.Это одна из вещей, которая делает XML таким удобным во флэш-памяти.Но если вы проверите тип, он вернется в виде 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
}

- update -

Примечания= XML и XMLlist могут и часто используются взаимозаменяемо.Каждый из них имеет доступ к одинаковому набору методов, но есть важное отличие.XML может иметь ровно один корневой узел, а XMLlist может иметь несколько.Это может не иметь большого значения для обычного использования, но в зависимости от структуры вашего входящего XML, может быть критическим отличием.Обычно я просто использую тип XML.Вот хорошая статья о xml против xmllist .

Cheers

3 голосов
/ 19 мая 2011

Используйте 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
}
1 голос
/ 19 мая 2011

Это часть анализатора E4X, который использует ActionScript.

Дочерние узлы элемента XML всегда заключаются в XMLList. Даже если у элемента есть только один дочерний элемент или атрибуты.

Самый простой способ получить строку на вашем объекте - это использовать

var obj: Object = new Object (); obj.theID = панель. @ id.toString ();

...