如何检查Flex / AS3中是否存在XML节点?

时间:2009-06-26 17:48:40

标签: xml flex actionscript-3 namespaces

为什么下面循环中的跟踪会在每次迭代时返回false,即使有8个可能值中有6个命名的节点???这只有在我有一个命名空间时才会发生。是否有其他方法来检查节点值???

<?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 个答案:

答案 0 :(得分:5)

方法hasOwnProperty不适用于XML节点。我相信这是E4X规范。但是,您可以随时询问具有E4X的节点,即使它不在那里,只看到您回来的XMLList的长度。像这样:

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

编辑: 如下所述,我对hasOwnProperty位错了。它确实与XML一起使用,它是一个导致问题的命名空间问题。您可以使用这个方便的代码段确保您的XML使用正确的命名空间:

if (myXML.namespace("") != undefined) {
    default xml namespace = myXML.namespace("");
}

答案 1 :(得分:1)

我知道这是一个旧线程,但如果其他人有同样的问题,这是另一种方法。您可以使用QName检查是否存在命名空间节点,而不是使用.length(),如下所示:


var xml:XML = 
<ns:outernode xmlns:ns="urn:ns:1.0">
    <ns:innernode>Here is some text content</ns:innernode>
</ns:outernode>;
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);

这将返回true。 QName q表示完全限定的节点名称“ns:innernode”。

答案 2 :(得分:0)

我认为问题在于命名空间。不用尝试,或尝试xmlns:letters = "letters"