Разница в выборке «.*» в XML и во flash.utils.Proxy

В XML выборка элементов через знак звёздочки говорит о том, что надо выбрать все дочерние узлы, не зависимо от типа узла или пространства имён XML элемента. Класс flash.utils.Proxy даёт нам возможность пользоваться выборками в своих классах. Я обнаружил разницу в поведении и дальше делюсь наблюдениями.

Вот, результат такой выборки в XML документе:

  1. var xml:XML = <root xmlns:ns="urn:some-uri">
  2. <node1/>
  3. <node2/>
  4. <node3/>
  5. <ns:node4/>
  6. <ns:node5/>
  7. <ns:node6/>
  8. </root>;
  9. trace(xml.*.toXMLString());
  10. /*
  11. <node1 xmlns:ns="urn:some-uri"/>
  12. <node2 xmlns:ns="urn:some-uri"/>
  13. <node3 xmlns:ns="urn:some-uri"/>
  14. <ns:node4 xmlns:ns="urn:some-uri"/>
  15. <ns:node5 xmlns:ns="urn:some-uri"/>
  16. <ns:node6 xmlns:ns="urn:some-uri"/>
  17. */

Выбраны все узлы, не зависимо от пространства имён в котором он лежит.

Если реализовать метод flash_proxy::getProperty() для наследника flash.utils.Proxy, то в случае такой выборки в этот метод будет передаваться экземпляр QName в базовом пространстве имён, т.е. его свойство uri будет равно пустой строке. Это может вызвать проблемы, т.к. все свойства в любых других пространствах имён будут опущены. А для того чтоб выбрать все значения во всех пространствах имён из наследника flash.utils.Proxy необходимо делать выборку через .*::*(для XML эта выборка коснётся исключительно узлов типа ELEMENT) - так вы указываете любое пространство имён и в метод flash_proxy::getProperty() будет передан экземпляр QName c uri равным NULL, что и требовалось, собственно. :)

Это не есть ошибка, т.к. в XML два вида узлов из пяти поддерживает пространства имён, поэтому в такой выборке они просто опускаются, а когда в выборке конкретно указывается пространство имён, то учитываются только элементы(или атрибуты, если делать выборку указав это).

Это мой опыт работы с flash.utils.Proxy и я не знаю как вы реализуете методы в наследниках flash.utils.Proxy, так что возможно для вас подобная ситуация окажется нормальной. Меня же подобная разность в поведении насторожила, поэтому и подчеркнул.

Метки: , ,

Добавить комментарий

Вы должны авторизоваться для отправки комментария.