PDA

Просмотр полной версии : поиск в XML


as_68
17.01.2006, 14:55
Есть 10 xml-ей.
Необходимо в цикле найти вхождение определенного слова во всех xml.
Подскажите, пожалуйста, как это организовать?

ЗЫ. такой код не успевает подгрузить значения из xml во flash


stop();
_root.region = new Array("1.xml", "2.xml", "3.xml", ..., "10.xml");
for (var index in _root.region) {
prepareXML(_root.region[index]);
}
prepareXML = function (file) {
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load(file);
myXML.onLoad = function(success) {
if (success == true) {
грузим данные в массив и проверяем совпадение
}
}
}

Juice_Green
17.01.2006, 15:00
в ссмысле 10 файлов?

as_68
17.01.2006, 15:07
Отредактировал исходник

nyctota
17.01.2006, 15:28
А слабо из обработчика myXML.onLoad после проверки на совпадение вызывать функцию? Для перебора всех значений массива заведи переменную, хранящую текущий индекс.

silin
17.01.2006, 15:39
как ты ставишь вопрос ('найти вхождение определенного слова '), то так
prepareXML = function (file) {
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load(file);
var f=file;
myXML.onLoad = function(success) {
if (success == true) {
var n=this.toString().indexOf('target')
if(n!=-1) trace('слово "target" в позиции #'+ n +' в '+f)
}
};
};
_root.region = new Array("1.xml", "2.xml", "3.xml");
for (var index in _root.region) {
prepareXML(_root.region[index]);
}

зы: сейчас только твой ЗЫ заметил
>>такой код не успевает подгрузить значения из xml во flash
не в том дело, что не успевает подгрузить, а в вызове функции до ее определения:
либо определяй ее как funtion prepareXML(..
либо prepareXML=function(.. , но до вызова..

as_68
17.01.2006, 16:17
2 nyctota
Я так и делаю
в hot - искомое слово
words- массив получаемый из каждого xml-я.
poisk_ar- массив результатов поиска
_root.poisk_ar = new Array();
_root.poisk_ar.push("0");

myXML.onLoad = function(success) {
if (success == true) {
all = myXML.firstChild;
for (i=0; i<all.childNodes.length; i++) {
_root.words[i+1] = all.childNodes[i].childNodes[0].nodeValue;
}
for (i=0; i<_root.words.length; i++) {
if (_root.words[i+1] == _root.hot) {
var pushed:Number = _root.poisk_ar.push([i+1]);
}
}
if (pushed == undefined) {
trace("не найдено");
} else {
for (i=0; i<_root.poisk_ar.length; i++) {
trace(_root.poisk_ar[i+1])
}
}
}
};

но в результате - undefined
похоже проскакивает раньше чем загружается

2 silin
наверное не так поставил вопорос - найти в узлах xml

as_68
17.01.2006, 17:16
Вот пример.
Обрабатывается, почему то, только последний файл. :(

silin
17.01.2006, 17:20
я бы так сделалvar region = new Array("1.xml", "2.xml", "3.xml");
var poisk_ar = [];
var toLoad = region.length;//сколько загрузок
var hot = 'second'
for (var index in region) prepareXML(region[index]);
function prepareXML(file) {
var myXML = new XML();
myXML.ignoreWhite = true;
myXML.load(file);
var f = file;
myXML.onLoad = function(success) {
if (success == true) {
var all = myXML.firstChild;
for (i=0 ; i<all.childNodes.length; i++) {
var word = all.childNodes[i].childNodes[0].nodeValue.split('\r').join('').split('\n').join('').split(' ').join('');
if (word == hot) poisk_ar.push({file:f, node:i});
}
if (!(--toLoad)) onLoadAll();//когда загрузятся все
}
};
}
function onLoadAll() {
for (var i in poisk_ar) {
trace('file:'+poisk_ar[i].file+' ; node:'+poisk_ar[i].node)
}
}

as_68
17.01.2006, 18:52
спасибо, попробую.

silin
17.01.2006, 19:42
посмотри в своем коде такие нюансы :
...
if (success == true) {
var all = myXML.firstChild;
for (i=0; i<all.childNodes.length; i++) {
_root.words[i+1] = all.childNodes[i].childNodes[0].nodeValue;
}
for (i=0,pushed=0; i<_root.words.length; i++) {
if (_root.words[i+1] == _root.hot) {
pushed+= _root.poisk_ar.push([i+1]);
}
}
...
имхо из-за них (может быть и не только) непонятки

Antares
17.01.2006, 21:41
1. В его коде есть onLoad после load -- и он еще ждет стабильной работы.
2. Имя ноды, где надо искать, знаешь? Тогда могу дать свой класс, который обрабатывает все ноды с именем Х как укажешь.

silin
17.01.2006, 22:44
2Antares
определять обработчик загрузки после вызова самой загрузки нелогично, конечно..
но, думаю тебе надо сочиниить устрашающий пример не рабочего кода,
иначе многие так и останутся в наивном убеждении, что это не принципиально (в пределах одного блока)

Antares
17.01.2006, 23:10
Сил, да мне собсна по барабану:)
Но эта практика с обработчиками может перенестись на звук и далее, и там уже все гораздо веселее.

as_68
18.01.2006, 15:20
2Antares
onLoad после load
спасибо - фигню спорол.


2ALL
А как(и куда) повесить запуск функции после того как все документы будут обработаны?

По index - не хотит. :)

silin
18.01.2006, 15:33
сколько документов знаешь, после обработки каждого крутишь счетчик, если все, то вызываешь функцию..(где ее расположить не принципиально - где тебе удобнее)
зы: в моем примере (#8) так и сделано..

as_68
18.01.2006, 15:40
2silin
спасибо

Juice_Green
19.01.2006, 08:30
хотел бы спросить еще вот что - почему файл не успевает подгрузится (XML), определение функции идет до ее вызова?