Функция поиска AS3 для поиска двухмерного массива из XML - PullRequest
0 голосов
/ 22 февраля 2011

Итак, у меня есть это задание, где я должен загрузить файл XML во флэш-памяти, затем выполнить поиск по нему и отобразить результат, когда он будет найден.Итак, мой xml выглядит так: ju675 kyu49

<item image="John.jpg" name="John" state = "New Jersey" >
<complex fid = "0"> mg749</complex>
<complex fid = "1"> ks749</complex>
<complex fid = "2"> ks678</complex>
    </item>

<item image="Smith.jpg" name="Smith" state = "California">
<complex fid = "0"> we649</complex>
<complex fid = "1"> sd449</complex>
<complex fid = "2"> df459</complex>
<complex fid = "3"> hj569</complex>
    </item>
</content>

У меня возникла проблема с отслеживанием комплекса.Я хочу функцию поиска, которая будет искать состояние и сложность обоих. Так что я загружаю XMl

loadXML();
function loadXML():void
{
var loader:URLLoader=new URLLoader();
loader.addEventListener(Event.COMPLETE,completeXMLHandler);

var request:URLRequest=new URLRequest('test4.xml');
try 
{
    loader.load(request);
} 
catch(error:Error) 
{
    trace('Impossible to load the document.');
}
}

 function completeXMLHandler(event:Event):void
 {
var loader:URLLoader=URLLoader(event.target);
var result:XML=new XML(loader.data);
var myXML:XMLDocument=new XMLDocument();
myXML.ignoreWhite=true;
myXML.parseXML(result.toXMLString());

for each (var usr in result.item)

var node:XMLNode=myXML.firstChild;
var items:int=int(node.childNodes.length);
for(var i:int=0;i<items;i++)
{

    var obj:Object=new Object();
    obj.name = node.childNodes[i].attributes.name;
    obj.state = node.childNodes[i].attributes.state;
    obj.image = node.childNodes[i].attributes.image;

    tyu.push(obj);

    var complexes:int=int(node.childNodes[i].childNodes.length);

    for(var j:int=0;j<complexes;j++)
    {

    var ghj:Object=new Object();
    ghj.complex=node.childNodes[i].childNodes[j].firstChild.nodeValue;
    comp.push(ghj);

    }
   main.push(comp);
   trace(main[0][1].complex)
}

currentUserbase = tyu.concat();
}

Так что, если я пытаюсь отследить «trace (main [1] [1] .complex)», это дает мнеошибка.Тогда я использовал функцию поиска:

function search(MouseEvent):void
{
currentUserbase = [];

for (var n:int = 0; n<tyu.length; n++){

if ((tyu[n].state.toLowerCase() == 
  search_state.text.toLowerCase() || search_state.text==""))
 {  
 currentUserbase.push(tyu[n]);
 }

 /*for (var k:int = 0; k<comp.length; k++){

if ((comp[n][k].complex.toLowerCase() ==
 autoComplete.text.toLowerCase() ||autoComplete.text==""))
{
    currentUserbase.push(comp[n][k]);
}
}*/



}
 updateList();
}

Ребята, я пытаюсь сделать это прямо сейчас.Пожалуйста, помогите мне в этом. Дайте мне знать, если вы хотите увидеть файл .fla.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2011

http://kirill -poletaev.blogspot.com / 2011/01 / поиск Проходная-XML-базы данных с использованием-as3_12.html
У меня есть что-то вроде этого, но только с двумя полями поиска, скажем, для ex здесь два поля поиска это имя и работа. XML для этого примера выглядит следующим образом:

<userbase>
<user id="1" firstname="John" secondname="McCallister"
 sex="Male" age="26"   job="Driver" />
<user id="2" firstname="Adam" secondname="Jackson" sex="Male" 
age="25" job="Shop assistant" />
<user id="3" firstname="Mary" secondname="McCallister" sex="Female" 
age="24" job="Manager" />
</userbase>

Итак, верхний работает, но я хочу, чтобы этот пример работал со следующим XML.

userbase>
<user id="1" firstname="John" secondname="McCallister" sex="Male" age="29">
<job>driver</job>
<job>mechanic</job>
<job>guide</job>
</user>

<user id="2" firstname="Adam" secondname="Jackson" sex="Male" age="25">
<job>Teacher</job>
<job>Shop assistant</job>
</user>

<user id="3" firstname="Mary" secondname="McCallister" sex="Female" age="24">    
<job>Manager</job>
<job>doctor</job>
<job>shopkeeper</job>
<job>electrician</job>
</user>
</userbase>

Где я хочу отобразить имя и фамилию в списке. Создать функцию поиска по имени и работе. При нажатии поиска отображается имя и фамилия, с которыми связано задание. Поскольку существует нерегулярное количество рабочих мест, я не знаю, как его выполнить.

0 голосов
/ 22 февраля 2011

Как подсказывает @Cay, взгляните на E4X, это сэкономит вам некоторое время, иначе потраченное на преобразование в объекты и их обход.

Код можно сделать с небольшим упрощением:

loadXML();
function loadXML():void {
    var loader:URLLoader=new URLLoader(new URLRequest('test4.xml'));//passing the url loads it automatically
    loader.addEventListener(Event.COMPLETE,completeXMLHandler);
    loader.addEventListener(IOErrorEvent.IO_ERROR, errorXMLHandler);
}
function errorXMLHandler(event:Event):void {
    trace('Impossible to load the document at url: ' + event.target.url);
}
function completeXMLHandler(event:Event):void {
    var result:XML=new XML(event.target.data);
    var items:XMLList = result.item;
    var complexes:XMLList = items.complex;
    var secondCompexItemsOnly:XMLList = items.complex.(@fid == "2");
    trace(items);
    trace(complexes);
    trace(secondCompexItemsOnly);
}

Взгляните на этот несколько похожий вопрос .

Обновление: @ Ханна, я внимательно прочитал твои комментарии, но все же я не уверен на 100%, чего ты хочешь достичь. Я предполагаю, что вы хотите найти узлы с правильным состоянием (выбранным из входных данных состояния) и правильным комплексным идентификатором (значением узла). Я предполагаю, что вы можете иметь несколько узлов элементов с правильным состоянием, но с разными именами, которые могут содержать сложные узлы с правильным значением комплексного узла.

Вот что я имею в виду:

var myXML:XML = <content><item image="John.jpg" name="John" state = "New Jersey" >
<complex fid = "0"> mg749</complex>
<complex fid = "1"> ks749</complex>
<complex fid = "2"> ks678</complex>
    </item>

<item image="Smith.jpg" name="Smith" state = "California">
<complex fid = "0"> we649</complex>
<complex fid = "1"> sd449</complex>
<complex fid = "2"> df459</complex>
<complex fid = "3"> hj569</complex>
    </item>
</content>;

function getItemByStateAndID(state:String,id:String,source:XML):XML{
    var resultsByState:XMLList = source.item.(@state == state);
    if(resultsByState){//if there are states with the required name, look for complex nodes with requred id
        var result:XML = <content />;
        for each(var item:XML in resultsByState){//might be multiple items with the same state, but different content ?
            var resultById:XMLList = item.complex.(text() == id);
            if(resultById){//if there are complex nodes with the right id
                var resultItem:XML = item.copy();//copy the item node, so we preserve it's attributes(image,name,state)
                     resultItem.complex = resultById;//replace the complex node list with the result;
                result.appendChild(resultItem);//add it to our main result node, might be multiple item nodes with same states and different names, but the right id, b
            }   
        }
        return result;//got all item nodes with the right state and ids, return values;     
    }
    return null;//no results, return null   
}

trace(getItemByStateAndID("New Jersey","ks678",myXML));
/*outputs: <content>
<item image="John.jpg" name="John" state="New Jersey">
  <complex fid="2">ks678</complex>
</item>
</content>*/

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...