Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.11.2008, 17:32
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 1  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
Post Алгоритм поиска подстроки в XML

Здравствуйте, подскажите пожалуйста, функцию, которая получает некую строку и искала бы совпадения по всем элементам существующего XML, а потом возвращала бы массив путей(массивов) в виде индексов узлов XML дерева до элементов с совпадением %)
Код:
public function searchStringInXML(string:String):Array
{
    ???
}
Например, в такой XML:
Код:
var someXML:XML = <xml>
                            <someNode>
                                     <node1 value1="первый узел" value2="первый подузел"/>
                                     <node2 value1="первый узел" value2="второй подузел"/>
                            </someNode>

                            <someNode>
                                      <node1 value1="первый узел" value2="первый подузел"/>
                                      <node2 value1="второй узел" value2="второй подузел"/>
                                      <node3 value1="санузел" value2="второй санузел"/>
                            </someNode>
                  </xml>
Делаем
trace(searchStringInXML("второй").toString());
Output: [0, 1], [1, 1], [1, 1], [1, 2]

Получили массив путей до узлов, в аттрибутах которых встречается слово "второй". [0, 1] - первый узел, второй подузел... и т.д.

Пробовал через вложенные 2 цикла for писать с временной xml, потом вконец запутался. Помогите, пожалуйста

Старый 07.11.2008, 19:44
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
для этого конкретного расклада
Код:
public function searchStringInXML(string:String):Array
{
	var res:Array = [];
	var level0:int = 0;
	for each(var node:XML in someXML.*) 
	{
		var level1:int = 0;
		for each(var subNode:XML in  node.*) 
		{
			for each( var attr:String in subNode.@* ) {
				if (attr.indexOf(string) != -1) 
				{
					res.push([level0, level1]);
				}
			}
			level1++;
		}
		level0++;
	}
	return res;
}

Старый 07.11.2008, 23:33
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
По-моему, проще оперировать всё-таки с XMLList, предварительно добавив идентификаторы:

Код:
var someXML:XML = <xml>
                            <someNode>
                                     <node1 value1="первый узел" value2="первый подузел"/>
                                     <node2 value1="первый узел" value2="второй подузел"/>
                            </someNode>

                            <someNode>
                                      <node1 value1="первый узел" value2="первый подузел"/>
                                      <node2 value1="второй узел" value2="второй подузел"/>
                                      <node3 value1="санузел" value2="второй санузел"/>
                            </someNode>
                  </xml>;
someXML..*.(parent().children()[childIndex()].@id = (parent().hasOwnProperty('@id') ? parent().@id.toString()+'_' : '') + childIndex());
var list:XMLList = someXML..*.((attributes().(toString().indexOf('второй') >= 0)).length() > 0);
trace(list.toXMLString());
Но если очень хочется массивы с путями (для редкостных извращенцев), то добавить к вышенаписанному:

Код:
var arr:Array = new Array();
var tmp:Array;
list.(hasOwnProperty('@id') && (tmp = @id.toString().split('_')) && (tmp.map(function(item, index, array) { return (parseInt(item)) } )) && arr.push(tmp));
tmp = null;
trace(arr.join('::'));


Последний раз редактировалось etc; 07.11.2008 в 23:58.
Старый 08.11.2008, 17:56
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 4  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
__etc, код очччччень "читабельный". Но зато кратко и понятно)))
А если, у меня аттрибуты не только id, а разные?

C этим понятно
Код:
someXML..*.(parent().children()[childIndex()].@* = ...
А как быть с
Код:
(parent().hasOwnProperty('@id')...

Старый 08.11.2008, 18:02
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Я не понял вопроса. Что значит разные? Это новые дополнительные аттрибуты, с определенным именем.

Старый 08.11.2008, 18:13
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 6  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
Че-то да... Это я не понял ответа вашего %)
Все работает прекрасно.
Меня строка смутила:
> По-моему, проще оперировать всё-таки с XMLList, предварительно добавив идентификаторы:
Я думал в исходную someXML добавить имя всех аттрибутов id.
А потом код просмотрел хорошо и разобрался. Спасибо

Старый 08.11.2008, 18:15
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Но я бы не стал использовать это прям в таком виде, конечно

Старый 08.11.2008, 18:25
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 8  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
Ну понятно, мне просто принцип был важен. Скелет, так сказать, для опытов и изучения.
Спрошу тогда сразу, чтоб темы не создавать.
Вот делаем мы поиск: indexOf('второй')
Но мы получаем поиск, чувствительный к регистру букв.
Как сделать нечувствительный? Юзать RegExp?
Ну и соответственно wholeWord и прочие стандартные настройки поиска?

Старый 08.11.2008, 18:48
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Ну сделайте RegExp, как угодно.

Старый 09.11.2008, 03:30
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 10  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
а может просто сделать toLowerCase? побыстрее будет чем RegExp ...

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.