Фильтрация в E4X

Это простой вопрос. В настоящее время я использую Mozilla Rhino для разработки небольшого веб-приложения. В качестве одного шага мне нужно получить веб-страницу и отфильтровать все ее узлы. Для этого я использую E4X. Я думал, что смогу сделать вот так:

var pnodes = doc..*(p);

Но это приводит к ошибке. Как это сделать правильно?

(Кстати: это всего лишь шаг для повышения производительности. Код уже работает хорошо, просто он немного медленный.)


person fb55    schedule 25.05.2010    source источник
comment
вы просто хотите получить все узлы на странице, включая вложенные?   -  person Anurag    schedule 25.05.2010
comment
Да, я хочу получить каждый узел, у которого есть p-узлы в качестве дочерних.   -  person fb55    schedule 25.05.2010


Ответы (1)


Вы должны уметь использовать следующее:

doc..*.(name() == "p")

Обратите внимание, что есть ошибка в реализациях Rhino и SpiderMonkey, где фильтр Выражение name() == "p" неправильно привязано к текущему узлу, поэтому ни один из методов XML или XMLList не определен.


Другое работоспособное решение - найти все p узлов в документе и собрать родительский элемент каждого в массиве.

var elements = [];

for each (var p in doc..p) {
    var parent = p.parent();
    if(elements.indexOf(parent) === -1)
        elements.push(parent);
}
person Anurag    schedule 25.05.2010
comment
Да, эффективность - моя проблема. Мое текущее разрешение проверяет каждый узел на наличие p-узлов перед его обработкой, это занимает некоторое время, для нормальной страницы около 0,5 с. Я полагаю, что простой сбор узлов может значительно сократить это время. Я видел, как люди фильтруют узлы так, как я пробовал раньше, я просто не могу понять, как это сделать. - person fb55; 25.05.2010
comment
Вышеупомянутая версия изначально фильтрует все p узлы и собирает родительский элемент каждого в массив, а не проверяет, является ли каждый узел p. Вы можете использовать родительский узел в качестве ключа в объекте для поиска O(1) вместо использования indexOf для проверки того, существует ли узел в массиве. - person Anurag; 25.05.2010