Почему в AS3 классы XML и XMList не связаны (с точки зрения наследования)? - PullRequest
2 голосов
/ 07 марта 2009

Не могу не подумать, что превращение XML и XMLList в не относящиеся друг к другу, так как они оба расширяют Object напрямую, является недостатком дизайна в базовой библиотеке AS3. Конечно, иметь расширение XML XMLList было бы гораздо более чистой системой, где XML считается XMLList только с одним членом?

Это также позволит избежать очень раздражающей практики запроса E4X, который может возвращать либо XML, либо XMLList, что может привести к ошибке приведения.

Так есть ли причина, по которой я не думаю о том, что XML и XMLList были разработаны, чтобы иметь только Object как общий тип?

Ответы [ 4 ]

2 голосов
/ 08 марта 2009

Кажется, что согласно спецификации ECMA для E4X (p22) и документации XMLList , класс XMLList содержит методы XML class, но только когда есть один член. Поэтому при выполнении запроса E4X результат всегда должен храниться в переменной типа XMLList .

Заранее, из-за именования этих объектов, я предположил, что объект XML представляет собой сложное дерево данных элемента XML, но согласно spec (p12), это неверно: «Каждое значение типа XML представляет элемент XML, атрибут, комментарий, инструкцию обработки или текстовый узел».

Это XMLList класс, который должен использоваться как более общий тип из двух: «Значение типа XMLList представляет документ XML, фрагмент XML или произвольную коллекцию объектов XML (например, результат запроса) "

Так что это решает мою проблему приведения, так как я никогда не должен был хранить запросы E4X как переменную типа XML . Я должен использовать только класс XML для итерации по XMLLists и разделения элементов XML.

0 голосов
/ 22 июня 2009

В ActionScript 3.0 XMLList - это новый способ обработки xml, поскольку, поскольку класс XML является AS 2, он включен для обеспечения обратной совместимости.

Если вы пишете новый код, вы должны сейчас использовать XMLList.

Надеюсь, это поможет

Jon

0 голосов
/ 21 мая 2009

Как вы заметили, автоматически меняющиеся типы XML и XMLList могут привести к путанице. Такие вещи случаются, когда умные программисты (указывая на Adobe здесь ...) делают удобные обертки вокруг вещей.

То, что происходит, это "автоматическое преобразование типов". И это не останавливается на типе XML. Рассмотрим этот пример XML:

<myXml>
    <sound id="0">Boogaloo</sound>
    <sound id="1">Bond theme</sound>
    <sound id="2">2001</sound>
</myXml>

Допустим, у меня есть вышеуказанный XML в переменной с именем myXml. В следующем примере E4X возвращает XMLList с одним элементом, и мы получаем доступ к первому элементу XML, используя [0]:

trace(myXml.sound.(@id == 0)[0] == <sound id="0">Boogaloo</sound>);
// traces true

В этом примере мы пропускаем часть [0], полагаясь на автоматическое преобразование типов Flash. Один возвращенный элемент преобразуется в XML:

trace(myXml.sound.(@id == 0) == <sound id="0">Boogaloo</sound>);
// traces true

Но в тех случаях, когда этот соответствующий XML-узел содержит простой текстовый узел, Flash автоматически преобразует тип еще дальше в строку:

trace(myXml.sound.(@id == 0) == "Boogaloo");
// traces true

И если текстовый узел можно интерпретировать как число (узел XML с идентификатором 2), Flash преобразует его даже дальше в число!

trace(myXml.sound.(@id == 2) == 2001);
// traces true

Woot!

Итак, что с этим делать?

Как вы заметили, вы должны быть очень осторожны с типами и «удобной» обработкой XML. Один из рекомендуемых методов - всегда использовать оператор доступа к массиву, чтобы указывать на первый элемент XML результата E4X, когда вы знаете, что хотите получить единственный результат:

config.users.admin[0].settings[0].email.(@type == "work")[0];

Поначалу это выглядит странно и добавляет многословность к коду, но выгода в том, что вы явно говорите, что ищете один admin элемент, один settings элемент и один email элемент типа "work". И ты привыкла к этому.

Другой совет - всегда не забывайте приводить к типу, который вы ожидаете использовать. Некоторые примеры:

allUsers       = XMLList(config.users);
adminSettings  = XML(config.users.admin[0].settings[0]);
adminWorkEmail = String(config.users.admin[0].settings[0].email.(@type == "work")[0]);
adminBirthYear = int(config.users.admin[0].birthdate[0].@year[0]);
0 голосов
/ 11 марта 2009

Итак, мой краткий ответ на этот вопрос заключается в том, что, глядя на дерево наследования, кажется, что два класса ( XMLList , XML ) не связаны.

Но, глядя на документацию по сценарию ECMA / AS3, они связаны между собой, скорее всего, с использованием системы-прототипа сценария ECMA / AS3.

Когда XMLList имеет только один член, он может рассматриваться как узел XML. Я предполагаю, что методы и поля класса XML вставляются в прототип XMLList AVM2.

...