2015-11-11 6 views
0

У меня есть XML в нижнем формате.Проверка наличия значений XML в массиве AS3

<user uid="0001"> 
    <FirstName>John</FirstName> 
    <LastName>Smith</LastName> 
    <ImagePath>images/0001.jpg</ImagePath> 
    <flightno>GS1234</flightno> 
</user> 
<user uid="0002"> 
    <FirstName>Luke</FirstName> 
    <LastName>Dixon</LastName> 
    <ImagePath>images/0002.jpg</ImagePath> 
    <flightno>TD1234</flightno> 
</user> 
<user uid="0003"> 
    <FirstName>Paul</FirstName> 
    <LastName>Kerr</LastName> 
    <ImagePath>images/0003.jpg</ImagePath> 
    <flightno>GS1234</flightno> 
</user> 

Это небольшой образец, есть пара 100 из них.

Я использовал фильтрацию E4x для фильтрации другого набора данных XML, который создает массив as3. Массив содержит некоторые номера рейсов (например: [GS1234, PB7367, TD1234].

Мне интересно, как я могу фильтровать свой XML (как показано выше), чтобы показывать только пользователей, чей «flightno» EXISTS в массиве AS3 .

Я предполагаю, что некоторые его вроде E4X запроса, но я не могу показаться, чтобы получить это право!

Спасибо!

ответ

1
// Don't mind me using this trick with inline XML, it's not the point. 
// It's here just to make it possible to copy and paste code 
// with multiline XML sample.The actual solution is a one-liner below. 
var usersXML:XML = new XML(<x><![CDATA[ 
<data> 
<user uid="0001"> 
    <FirstName>John</FirstName> 
    <LastName>Smith</LastName> 
    <ImagePath>images/0001.jpg</ImagePath> 
    <flightno>GS1234567</flightno> 
</user> 
<user uid="0002"> 
    <FirstName>Luke</FirstName> 
    <LastName>Dixon</LastName> 
    <ImagePath>images/0002.jpg</ImagePath> 
    <flightno>TD1234</flightno> 
</user> 
<user uid="0003"> 
    <FirstName>Paul</FirstName> 
    <LastName>Kerr</LastName> 
    <ImagePath>images/0003.jpg</ImagePath> 
    <flightno>GS1234</flightno> 
</user> 
</data> 
]]></x>.toString()); 

// once again, the way I create sample departingXML 
// is not important, it's just for copying and pasting into IDE. 
var departingXML:XML = new XML(<x><![CDATA[ 
<flights> 
    <flight> 
     <number>GS1234</number> 
     <date>10/11/2015</date> 
     <time>1440</time> 
    </flight> 
    <flight> 
     <number>TD1234</number> 
     <date>10/11/2015</date> 
     <time>1450</time> 
    </flight> 
</flights> 
]]></x>.toString()); 


// 1. create filter array 
var flightNoArray:Array = []; 
departingXML.flight.number.(flightNoArray.push(toString())); 

trace(flightNoArray); // GS1234,TD1234 
trace(typeof(flightNoArray[0])); // string 

// 2. filter users: 
var list:XMLList = usersXML.user.(flightNoArray.indexOf(flightno.toString()) >= 0); 

trace(list); // traces users 0002 and 0003 

Я бы не назвал это эффективным или, по крайней мере, для чтения однако.

// Note: this line is somewhat queer and I don't like it, 

departingXML.flight.number.(flightNoArray.push(toString())); 

// but this is the only way I can now think of to get and array 
// of strings from an XMLList nodes without a loop. 
// I would advise to use a readable and simple loop instead. 
  • usersXML.user - это становится вам XMLList со всеми узлами имени «пользователь»
  • usersXML.user.(some condition) - это фильтрует XMLList узлов пользовательских данных условие
  • flightNoArray.indexOf(flightno.toString()) >= 0 - и это условие фильтра
  • flightno.toString() - получает строку в полетеno
  • REFERENCE: Traversing XML structures.
  • Explanation of the search trick в примечании выше.

UPDATE: оказалось в комментариях, что это было также то, как набор фильтров был заполнен, который вызывает проблемы. В приведенном ниже коде демонстрируется еще несколько E4X.

Это, как был создан список фильтров и что на самом деле происходит:

// once again, the way I create sample departingXML 
// is just for the sake of copying and pasting, it's not related to solution. 
var departingXML:XML = new XML(<x><![CDATA[ 
<flights> 
    <flight> 
     <number>GS1234</number> 
     <date>10/11/2015</date> 
     <time>1440</time> 
    </flight> 
    <flight> 
     <number>TD1234</number> 
     <date>10/11/2015</date> 
     <time>1450</time> 
    </flight> 
</flights> 
]]></x>.toString()); 

// the way it was done before 
var flightNoArray: Array = []; 
for each(var num: XML in departingXML.flight) { 
    flightNoArray.push(num.number); 

    // WARNING! num.number is an XMLList! It s NOT a string. 
    // Addressing nodes by name ALWAYS gets you an XMLList, 
    // even if there's only one node with that name 
    // Hence, `flightNoArray.indexOf("string")` could not possibly work, 
    // as there are lists inside of the array, not strings. 


    // We can check if this is a fact: 
    trace(flash.utils.getQualifiedClassName(flightNoArray[flightNoArray.length-1])); 
    // (traces XMLList) 

    // Or this way (note toXMLString() method) 
    trace(flightNoArray[flightNoArray.length-1].toXMLString()); 
    // (traces <number>GS1234</number>) 
} 

trace(flightNoArray); 

trace(flightNoArray); следы GS1234, TD1234, потому что это путь ToString() метод работает для XML-узлов - это поможет вам текст, это внутри. Вот почему существует специальный метод toXMLString(), который получает строковое представление узла.

+0

Кажется, что это не работает, я просто «не могу разобрать XML» –

+0

Я предполагаю, что это просто, что flash pro cs6 (я использую) способен анализировать встроенный xml с несколькими строками и предыдущими версиями Flash IDE нет. В любом случае, суть находится в строке ниже '// solution:'. –

+0

Я использую cc mate, плохо имею игру. Спасибо за вашу помощь. –

Смежные вопросы