На скольких уровнях глубина реализации e4x с использованием нотации доступа к массиву в квадратных скобках в AS3? - PullRequest
0 голосов
/ 21 августа 2011

С помощью скобочных обозначений я могу получить доступ к прямому дочернему узлу по имени или атрибуту, используя следующий код:

Пример XML:

<item name="item1">
   <categories name="catList">
      <category name="cat1">
   </categories>
</item>

Пример доступа к прямому дочернему узлу:

trace(xml["categories"].toString()); // <categories><category/></categories> 

Пример доступа к атрибуту узла:

trace(xml["@name"].toString()); // item1

Обновлено : есть ли способ доступа к вложенному элементу / вложенному элементу / вложенному атрибуту, используя только обозначение в одной квадратной скобке?

Например,

trace(xml["categories.category.@name"].toString()); // cat1

или

trace(xml["categories.@name"]); // catList

Ответы [ 3 ]

2 голосов
/ 21 августа 2011

Использование обозначения в квадратных скобках не требуется, если вы знаете имена узлов, к которым вы обращаетесь. Это должно работать нормально:

xml.categories.category.@name.toString();

Обозначение в квадратных скобках используется для доступа к свойствам с именем строки. Это не имеет отношения к E4X. Перевод всех свойств в квадратные скобки будет выглядеть так:

xml['categories']['category']['@name']['toString']();
1 голос
/ 21 августа 2011

Вы можете сделать что-то вроде этого:

xml["categories"]["category"][0]["@name"].toString();

Класс XML реализует интерфейс, подобный Proxy .При использовании динамические свойства динамически разрешаются, поэтому вы можете вызывать свойства, которые не определены явно в классе XML.Однако, если вы делаете какие-то динамические XML-имена, и вам нужно использовать квадратную скобку со строками, то вы можете это сделать.Вы просто должны обернуть каждый в свой [].

Однако, возможно, есть вещи, которые вы можете сделать с нотацией e4x, которые вы не можете сделать с [].А именно делает такие вещи, как:

xml..@name

, который найдет все атрибуты имени во всем дереве XML.Я не думаю, что есть другой способ представить это.

0 голосов
/ 21 августа 2011

Судя по вашим комментариям к другим ответам, кажется, что это довольно неудачное использование e4x глубоко в Flex SDK и не является чем-то, что вы можете изменить. В таком случае я бы сказал, что извините, но вам, скорее всего, не повезло. Если, конечно, у вас нет переменной 'a', и вы можете передать ее, в этом случае вы можете сделать выбор заранее и передать соответствующий фрагмент xml любой функции, которую вы вызываете.

Из любопытства (и для того, чтобы, возможно, дать лучший ответ), где в Flex SDK это?


Я посмотрел на SortField в соответствии с вашими комментариями, и, хотя это кажется громоздким (и несколько опасным) злоупотреблять внутренностями метода xmlCompare, вы должны иметь возможность обойти его, предоставив пользовательскую compareFunction .

...