2013-12-16 2 views
0

Я пытаюсь найти этот XML-документ в as3as3 поиск 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); 
} 

С «след (mineralList)» команда будет успешно проследить весь файл XML, и если я изменить его на «след (xmlData.mineral (цвет ==.„Белый“));» то он отслеживает все узлы, что элемент со значением «Белый».

<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> 

Однако, если я ищу Blue вместо White, он ничего не прослеживает. Я предполагаю, что это потому, что минеральные узлы, содержащие элемент со значениями «Синего», также имеют несколько других значений цвета. Это проблема, которую я пытаюсь оценить.

Мне нужно найти цвет и вытащить все узлы, которые имеют одно из этих значений цвета, независимо от других значений цвета.

ответ

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(); 
} 

вместо запуска кода после того, как xml был загружен в функцию ParseMinerals, я поместил его в новую функцию под названием «поиск», которая запускается при нажатии кнопки «поиск».

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 

и если я искать «Blue», то программа прослеживает

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

Я надеюсь, что это помогает любому, кто пытается достичь аналогичной цели.

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);  
      } 
     } 
    } 
+0

Я пробовал применить кодекс к моему коду, и я получаю сообщение о синтаксисе 1084: ожидающий перед двоеточием –

+0

Проверьте изменение. –