0

我正在尝试在 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>

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

我需要能够搜索一种颜色并拉出具有这些颜色值之一的所有节点,而不管是否具有其他颜色值。

4

2 回答 2

0

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

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

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

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

于 2013-12-18T20:54:28.997 回答
0

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

 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);     
           }
        }
   }
于 2013-12-17T04:53:10.793 回答