【问题标题】:Adobe Air 3.3 or AS3: Dynamic variable to search xmlAdobe Air 3.3 或 AS3:用于搜索 xml 的动态变量
【发布时间】:2012-07-28 15:40:50
【问题描述】:

我正在使用 Flash CS6 - Adob​​e AIR 3.3: 我不想在我的 XML 中准确地输入我想搜索的内容,而是想使用一个可以更改的动态变量来搜索不同的类别和日期。以下是我想使用的代码:

var someCategory:String = new String("food");
var someDay:String = new String("monday");

var locationsLoader:URLLoader = new URLLoader();
locationsLoader.load(new URLRequest("http://www.myfile.xml"));
locationsLoader.addEventListener(Event.COMPLETE, init);

//load xml

function init(e:Event):void
{
theXML = new XML(e.target.data);
theXML.ignoreWhitespace = true;
e.currentTarget.close();

for(var i:int = 0; i < theXML.someCategory.length(); i++) 
{
if(theXML.someCategory[i].somdDay != "un")
{
//do soemthing
}
}

此代码目前仅在我在“for”和“if”循环中实际键入“food”和“monday”时才有效。有什么建议吗?

XML 将是...

<xml>
<food>
<monday>yes</monday>
</food>
<food>
<monday>yes 2</monday>
</food>
<food>
<monday>un</monday>
</food>

</xml>

这是目前的工作方式:

var someCategory:String = new String("food");
var someDay:String = new String("monday");

var locationsLoader:URLLoader = new URLLoader();
locationsLoader.load(new URLRequest("http://www.myfile.xml"));
locationsLoader.addEventListener(Event.COMPLETE, init);

//load xml

function init(e:Event):void
{
theXML = new XML(e.target.data);
theXML.ignoreWhitespace = true;
e.currentTarget.close();

for(var i:int = 0; i < theXML.food.length(); i++) 
{
if(theXML.food[i].monday != "un")
{
//do soemthing
}
}

【问题讨论】:

  • 您的代码中有很多错误,请您更正一下,例如 somDay、I 和 someCategory 应该输入为字符串还是数组?您的 XML 中的日期在哪里?显示也适合您的代码。
  • 很抱歉。是的,它们是字符串。我修复了 XML,并展示了当前的工作原理。
  • 感谢您的更正,请参阅下面的答案,相信这可以很好地满足您的目的,忽略我将 XML 内联并摆脱了 Loader 等事实,只是为了便于检查。跨度>

标签: xml actionscript-3 air flash-cs5


【解决方案1】:

复制您的代码并逐步更改每个部分,并且似乎与我所做的每个更改都得到相同的结果,所以我相信下面的内容是正确的。

package
{
    import flash.display.Sprite;

    public class TestAS3Project extends Sprite
    {
        public var theXML:XML = new XML(<xml>
                <food>
                    <monday>yes</monday>
                </food>
                <food>
                    <monday>yes 2</monday>
                </food>
                <food>
                    <monday>un</monday>
                </food>

            </xml>);
        public function TestAS3Project()
        {
            init();
        }
        private function init():void
        {

            var someCategory:String = new String("food");
            var someDay:String = new String("monday");

            theXML.ignoreWhitespace = true;

            for(var i:int = 0; i < theXML[someCategory].length(); i++) 
            {
                if(theXML[someCategory][i][someDay] != "un")
                {
                    //do soemthing
                    trace(theXML[someCategory][i][someDay]);
                }
            }
        }
    }
}

【讨论】:

  • 谢谢 - 将变量放在括号中修复它。快把我逼疯了!
  • 没问题,如果可以,请接受,它可以解决您的问题。这里有一个关于 E4X 的好站点 senocular.com/flash/tutorials/as3withflashcs3/?page=4 我只是在了解以前的知识,如果您在访问/调用时需要使用字符串,则可以使用方括号访问类的成员。
  • 长期使用elements() 可能比使用括号中的节点名称更好,因为如果您最终拥有一个缺少具有给定名称的子节点的节点,它就会爆炸。
  • @AmyBlankenship 你仍然可以对elements 有一些问题,我发现。对hasOwnProperty 进行条件检查以限制结果很有用。我正在处理的项目中的一个示例,其中xmlID 是一个变量:xml..someData.(@id == xmlID).(hasOwnProperty("@frameOffset")).@frameOffset.toString()。即使数据不存在,此结果仍会提供有效的空输出。如果我不确定每个someData 元素都有一个id 属性,那么我可以在链中放另一个hasOwnProperty 检查。
  • 我通常沿着树向下走,检查每个点的有效节点,然后使用 String(finalNode@childName),它要么为空,要么包含我的东西。类似的想法。如果不是所有 someData 节点都具有 id 属性,您的表达式将失败。
【解决方案2】:

我会使用条件语句并使用for each 循环而不是for 循环:

var cat:String = new String("food");
var day:String = new String("monday");

for each (var node:XML in theXML[cat].(child(day) != 'un')) {
    trace(node[day]);
}

theXML[cat].(child(day) != 'un') 部分表示

(循环)对于节点名称为 [cat] 的每个子节点的 theXML 具有节点名称为 [day] 的子节点这不是'un'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多