AS2 XML-анализ, циклы, массивы и объекты - PullRequest
0 голосов
/ 08 июля 2011

Я хочу проанализировать файл XML с AS2, но я не уверен, как поместить полученные значения в массив объектов с количеством ключей, совпадающих с найденными значениями.В коде есть операторы if для фильтрации нежелательных элементов, но количество ключей массива всегда будет равно пределу длины цикла for.

Как создать массив объектов, содержащий только те значения, которыене определены?

//AS2

var xml:XML = new XML();
xml.ignoreWhite=true;

xml.onLoad = function(success)
{
    if (success) 
    {
        var myImage = xml.firstChild.childNodes;
        var img_arr = new Array();

        for (i=0; i<myImage.length; i++) 
        {
            img_arr[i] = new Object();

            var nodeName = xml.firstChild.childNodes[i].NodeName;


            //condition to filter out values
            if (nodeName == "value")
            {
                img_arr[i]["file"] = xml.firstChild.childNodes[i].firstChild.NodeValue;
                img_arr[i]["name"] = xml.firstChild.childNodes[i].childNodes[1].NodeValue;    
            }
        }
        //trace(img_arr.length)
    }
}
xml.load("test.xml");

Возвращает массив, например:

img_arr [файл] [0] = значение0
img_arr [имя] [0] = имя0
img_arr [файл] [1] = не определено
img_arr [имя] [1] = не определено
img_arr [файл] [2] = значение2
img_arr [имя] [2] = имя2

Как вы получаете этот массив?

img_arr [файл] [0] = значение0
img_arr [имя] [0] = имя0
img_arr [файл] [1] = значение2
img_arr [имя] [1] = имя2

1 Ответ

1 голос
/ 10 октября 2012

Вы можете попытаться найти пустые значения, прежде чем помещать их в массив.

Что-то вроде:

if (xml.firstChild.childNodes[i].firstChild.NodeValue.length > 0) {
    // here put the value into your array
}

Используя длину значения, чтобы определить, является ли оно нулевым или нет,смотреть на них как на String, иногда может быть полезно: если его 0, это означает, что в nodeValue не найдено ни одного символа, показывая, что либо узел не существует, либо узел пуст.

Использованиеваш код, вот что я предлагаю (должен быть адаптирован к тому, что вы делаете, не был проверен):

for (i=0; i<myImage.length; i++) {
    var nodeName:String = xml.firstChild.childNodes[i].NodeName;
    var newNode:Object;

    //condition to filter out values
    if (nodeName == "value") {
        // means that both of the nodes exists and contain a valid value
        if (xml.firstChild.childNodes[i].firstChild.NodeValue.length > 0 && xml.firstChild.childNodes[i].childNodes[1].NodeValue.length > 0) {
           newNode = new Object();
           newNode["file"] = xml.firstChild.childNodes[i].firstChild.NodeValue;
           newNode["name"] = xml.firstChild.childNodes[i].childNodes[1].NodeValue;
       }
    }
    if (newNode != null && newNode != undefined) {
        img_arr.push(newNode);
    }
}
...