![]() |
|
||||||||||
|
|||||
|
Здравствуйте, подскажите пожалуйста, функцию, которая получает некую строку и искала бы совпадения по всем элементам существующего XML, а потом возвращала бы массив путей(массивов) в виде индексов узлов XML дерева до элементов с совпадением %)
Например, в такой 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, потом вконец запутался. Помогите, пожалуйста ![]() |
|
|||||
|
для этого конкретного расклада
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;
}
|
|
|||||
|
Et cetera
Регистрация: 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());
Последний раз редактировалось etc; 07.11.2008 в 23:58. |
|
|||||
|
__etc, код очччччень "читабельный". Но зато кратко и понятно)))
А если, у меня аттрибуты не только id, а разные? C этим понятно А как быть с |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Я не понял вопроса. Что значит разные? Это новые дополнительные аттрибуты, с определенным именем.
|
|
|||||
|
Че-то да... Это я не понял ответа вашего %)
Все работает прекрасно. Меня строка смутила: > По-моему, проще оперировать всё-таки с XMLList, предварительно добавив идентификаторы: Я думал в исходную someXML добавить имя всех аттрибутов id. А потом код просмотрел хорошо и разобрался. Спасибо |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Но я бы не стал использовать это прям в таком виде, конечно
![]() |
|
|||||
|
Ну понятно, мне просто принцип был важен. Скелет, так сказать, для опытов и изучения.
Спрошу тогда сразу, чтоб темы не создавать. Вот делаем мы поиск: indexOf('второй') Но мы получаем поиск, чувствительный к регистру букв. Как сделать нечувствительный? Юзать RegExp? Ну и соответственно wholeWord и прочие стандартные настройки поиска? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Ну сделайте RegExp, как угодно.
|
|
|||||
|
стервочка (я мужик)
|
а может просто сделать toLowerCase? побыстрее будет чем RegExp ...
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|