2010-05-25 5 views
1

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

var pnodes = doc..*(p); 

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

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

+0

Вы просто хотите получить ** все ** узлы на странице, в том числе вложенные? – Anurag

+0

Да, я хочу получить каждый узел, у которого есть p-узлы, как его дети. – fb55

ответ

2

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

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

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


Другим решением является работоспособным для поиска всех p узлов в документе, и накапливают родителя каждого в массиве.

var elements = []; 

for each (var p in doc..p) { 
    var parent = p.parent(); 
    if(elements.indexOf(parent) === -1) 
     elements.push(parent); 
} 
+0

Да, эффективность - это моя проблема. Мое текущее разрешение проверяет каждый узел для p-узлов перед его обработкой, это занимает некоторое время, для нормальной страницы около 0,5 с. Я думаю, что только сбор узлов эффективно мог бы сократить это время резко. Я видел людей, фильтрующих узлы так, как я пробовал это раньше, я просто не могу понять, как это сделать. – fb55

+0

Вышеупомянутая версия изначально фильтрует все узлы 'p' и собирает родительский элемент каждого в массив, а не проверяет, является ли каждый узел' p'. Вы можете использовать родительский узел как ключ в объекте, чтобы сделать поиск «O (1)» вместо «indexOf», чтобы проверить, существует ли узел в массиве. – Anurag

Смежные вопросы