Как я могу проверить наличие узла XML во Flex / AS3? - PullRequest
2 голосов
/ 26 июня 2009

Почему трассировка в цикле ниже возвращает false для каждой итерации, даже если есть узлы ARE, названные с 6 из 8 возможных значений ??? Это происходит только тогда, когда у меня есть пространство имен. Есть ли какой-нибудь другой способ проверить значения узла ???

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            private namespace ltrs = "letters";

            use namespace ltrs;

            private var myArray:Array = ["a","b","c","d","e","f","g","h"];

            private function checkXML():void
            {
                for each (var p:String in myArray)
                {
                    trace(myXML.hasOwnProperty(p).toString()); // returns false;
                }
            }
        ]]>
    </mx:Script>

    <mx:XML id="myXML">
        <root xmlns="letters">
            <a>true</a>
            <b>true</b>
            <c>true</c>
            <e>true</e>
            <f>true</f>
            <g>true</g>
        </root>
    </mx:XML>

    <mx:Button click="checkXML();" />
</mx:Application>

Ответы [ 3 ]

5 голосов
/ 26 июня 2009

Метод hasOwnProperty просто не работает с узлами XML. Я считаю, что это к спецификации E4X. Тем не менее, вы всегда можете запросить узел с E4X, даже если его там нет, и просто посмотреть, какова длина XMLList, которую вы получите. Вот так:

trace(myXML[p].length());

EDIT: Как отмечено ниже, я ошибся насчет бита hasOwnProperty. Он работает с XML, и это проблема пространства имен, которая вызывает вашу проблему. Вы можете убедиться, что ваш XML использует правильное пространство имен, используя этот удобный фрагмент:

if (myXML.namespace("") != undefined) {
    default xml namespace = myXML.namespace("");
}
1 голос
/ 07 апреля 2011

Я знаю, что это старая ветка, но в случае, если у других такая же проблема, вот другой способ сделать это. Вместо того, чтобы использовать .length (), вы можете проверить существование узла в пространстве имен, используя QName, например:

<code>
var xml:XML = 
<code><ns:outernode xmlns:ns="urn:ns:1.0"></code>
    <code><ns:innernode>Here is some text content</ns:innernode></code>
<code></ns:outernode>;</code>
var ns:Namespace = new Namespace("urn:ns:1.0");
var q:QName = new QName(ns, "innernode");
var b:Boolean = xml.hasOwnProperty(q);
trace("Has innernode: " + b);

Это вернет истину. QName q представляет полное имя узла "ns: innernode".

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

Я думаю, что проблема находится в пространстве имен. Попробуйте без или попробуйте xmlns:letters = "letters"

...