Разбор XML-атрибутов как XMLList

В следующем блоке кода, если я отлаживаю и смотрю на var 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)
}

person The_asMan    schedule 19.05.2011    source источник


Ответы (3)


Синтаксический анализатор 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
}

-- Обновить --

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

Ваше здоровье

person Bosworth99    schedule 19.05.2011
comment
Знаешь, я мог бы поклясться, что пробовал это. Думаю, пора заканчивать вечер, тай. Не могли бы вы объяснить, почему @atributeNAME возвращает XMLList, а не значение, как можно было бы ожидать? - person The_asMan; 19.05.2011
comment
Я всегда находил приведение типов более аккуратным способом делать что-то. Единственная проблема заключается в том, что новичкам трудно понять приведение типов. - person Marty; 19.05.2011
comment
@the_asMan — @attribute ДЕЙСТВИТЕЛЬНО возвращает значение (точнее, это делает анализатор AS3), но тип остается xml/list до тех пор, пока он не будет специально приведен. @Marty - я согласен с мнением о кастинге. Это может быть запутанной темой для посвященных в as3. Однако - это настолько критическая концепция и вообще правильный ответ на подобную ситуацию, что я не вижу причин не прыгать ;) - person Bosworth99; 19.05.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: [email protected](),
        normalID: panel.@id
    };

    trace(typeof(obj.stringID), obj.stringID); //string
    trace(typeof(obj.normalID), obj.normalID); //xml
}
person Marty    schedule 19.05.2011

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

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

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

var obj:Object = новый объект(); obj.theID = панель[email protected]();

person Nathan Smith    schedule 19.05.2011
comment
Однако это не дочерний узел, это атрибут. - person The_asMan; 19.05.2011
comment
На самом деле, поскольку он имеет оболочку XMLList, не будет ли панель.@id[0] более подходящей? - person The_asMan; 19.05.2011
comment
Также помещает его в XMLList, если он имеет атрибуты. Я также считаю, что использование toString() делает код более читаемым. - person Nathan Smith; 19.05.2011