【问题标题】:as3 search xml with multiple elementsas3搜索具有多个元素的xml
【发布时间】:2014-01-04 10:14:38
【问题描述】:

我正在尝试在 as3 中搜索这个 XML 文档

<mineral>
    <name>Calcite</name>
    <color>White</color
    <diaphaneity>Opaque</diaphaneity>
</mineral>
<mineral>
    <name>Spangolite</name>
    <color>Blue</color>
    <color>Green</color>
    <color>Blue Green</color>
    <color>Dark Green</color>
    <color>Emerald Green</color>
    <diaphaneity>Transparent</diaphaneity>
    <diaphaneity>Translucent</diaphaneity>
</mineral>
<mineral>
    <name>Barite</name>
    <color>Yellow</color>
    <color>Honey</color>
    <diaphaneity>Transparent</diaphaneity>
    <diaphaneity>Translucent</diaphaneity>
    <diaphaneity>Opaque</diaphaneity>
</mineral>
<mineral>
    <name>Landauite</name>
    <color>White</color>
    <diaphaneity>Transparent</diaphaneity>
    <diaphaneity>Translucent</diaphaneity>
</mineral>
<mineral>
    <name>Sapphire</name>
    <color>Blue</color>
    <color>Blue green</color>
    <diaphaneity>Transparent</diaphaneity>
    <diaphaneity>Translucent</diaphaneity>
</mineral>

并首先按颜色过滤结果。因此,如果您搜索“蓝色”,您将获得所有包含“颜色”元素且值为“蓝色”的矿物(Spangolite 和 Sapphire)的结果。

我加载我的 XML 并创建一个包含所有元素的 XMLList。

var dataLoader:URLLoader = new URLLoader();
var xmlData:XML;
dataLoader.addEventListener(Event.COMPLETE, LoadComplete); 
dataLoader.load(new URLRequest("mineralXML.xml"));
function LoadComplete(e:Event):void
{
     xmlData = new XML(e.target.data);
     ParseMinerals(xmlData);
}

function ParseMinerals(mineralXML:XML):void
{
     var  mineralList:XMLList  =  mineralXML.mineral;

trace(mineralList);
}

使用“trace(mineralList)”命令,它将成功跟踪整个 XML 文件,如果我将其更改为“trace(xmlData.mineral.(color == "White"));”然后它会追踪所有节点的值为“White”的元素。

<mineral>
  <name>Calcite</name>
  <color>White</color>
  <diaphaneity>Opaque</diaphaneity>
</mineral>
<mineral>
  <name>Landauite</name>
  <color>White</color>
  <diaphaneity>Transparent</diaphaneity>
  <diaphaneity>Translucent</diaphaneity>
</mineral>

但是,如果我搜索蓝色而不是白色,它不会追踪任何内容。我猜这是因为包含“蓝色”值的元素的矿物节点也有多个其他颜色值。这是我试图评估的问题。

我需要能够搜索一种颜色并提取所有具有其中一种颜色值的节点,而不管是否有其他颜色值。

【问题讨论】:

    标签: xml actionscript-3 search xmllist


    【解决方案1】:

    在您的代码中,在颜色 == 白色的情况下,节点只有一个节点。在其他情况下,它有多个节点。所以试试这样,

     private function ParseMinerals(mineralXML:XML):void
        {
           var  mineralList:XMLList  =  mineralXML.mineral;
           for each (var mineral:XML in mineralList)
           {
            if(mineral.color.length()>1)
                {
               for each(var color in mineral.color)
               {
                   if(color == "Green")
                   {
                  trace(mineral);       
                   }    
                }
            }
            else
            {
               if(mineral.color == "White")
               {
                trace(mineral);     
               }
            }
       }
    

    【讨论】:

    • 我尝试将您的代码建议应用到我的代码中,但收到 1084:语法错误:期望在冒号前
    【解决方案2】:

    我实际上是通过以下代码实现的:

    首先我为定义结果时包含的结果创建了一个数组,并创建了一个变量来记录循环所在的结果编号

    var resultArray:Array = new Array;
    var resultNum:Number = 0;
    

    然后我用 XML 数据制作了一个共享对象

    function ParseMinerals(mineralXML:XML):void
    {
         //create a var called memory and datatype it to SharedObject and name the
         //file "attributes"
         var memory:SharedObject = SharedObject.getLocal("attributes");
    
         //create an XMLList containing the information in mineralXML.mineral
         var  mineralList:XMLList  =  mineralXML.mineral;
    
         //save the data in mineralList to shared object
         memory.data.mineralList = mineralList;
         memory.flush();
    }
    

    我没有在 ParseMinerals 函数中加载 xml 后运行代码,而是将它放在一个名为“search”的新函数中,当您按下“search”按钮时该函数会运行。

    function search(event:MouseEvent):void
    {
        //load shared file
        var memory:SharedObject = SharedObject.getLocal("attributes");
    
        //create a variable that is the length of the list of minerals
        var len:int = memory.data.mineralList.length();
    
        //create variables to temporarily store information regarding minerals color 
        //and name
        var thisColor:String;
        var thisName:String;
    
        //create var that increments for each time you loop through a "mineral" node
        for (var i:int = 0; i < len; i++) {
            //create var that increments for each time you loop through a "color"
            //element  within a single "mineral" node
            for (var c:int = 0; c < xmlData.mineral[i].color.length(); c++) {
                //make thisColor equal to the current color that the for loop is on
                thisColor = xmlData.mineral[i].color[c];
                //make thisName equal to the current name that the for loop is on
                thisName = xmlData.mineral[i].name;
                //if the color that the for loop is currently on is equal to the
                //color you are searching for...
                if (thisColor == memory.data.mineralColor){
                    //... then put the name of that mineral into an array
                    resultArray.push(thisName);
                    //... add 1 to the current result number
                    resultNum ++;
                    //... and trace the current result number and the name of the
                    //... mineral corresponding to the color you are searching for
                    trace("Result #" + resultNum + ": " + (thisName));
                }
            }
        }
        //reset array
        resultArray.length = 0;
    
        //reset result number
        resultNum = 0;
    }
    

    我不确定这是否是实现目标的最有效方式,但它确实有效。 如果我从列表中选择“白色”并单击我所做的搜索按钮,程序会跟踪

    Result #1: Calcite 
    Calcite
    

    如果我搜索“蓝色”,则程序会跟踪

    Result #1: Spangolite
    Result #2: Sapphire
    Spangolite, Sapphire
    

    我希望这可以帮助任何试图实现类似目标的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多