Progress28.ru

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Guest list php node

XML DOM Node List

A list of nodes is returned by the getElementsByTagName() method and the childNodes property.

Try it Yourself — Examples

The examples below use the XML file books.xml.

Get the text from the first element
This example uses the getElementsByTagName() method to get the text from the first element in «books.xml».

Loop through nodes using the length property
This example uses node list and the length property to loop through all elements in «books.xml»

Get the attribute of an element
This example uses a attribute list to get attribute from the first element in «books.xml».

Header

DOM Node List

When using properties or methods like childNodes or getElementsByTagName(), a node list object is returned.

A node list object represents a list of nodes, in the same order as in the XML.

Nodes in the node list are accessed with index numbers starting from 0.

The following image represents a node list of the elements in «books.xml»:

Suppose «books.xml» is loaded into the variable xmlDoc.

This code fragment returns a node list of title elements in «books.xml»:

After the execution of the statement above, x is a node list object.

The following code fragment returns the text from the first element in the node list (x):

Example

After the execution of the statement above, txt = «Everyday Italian».

Node List Length

A node list object keeps itself up-to-date. If an element is deleted or added, the list is automatically updated.

The length property of a node list is the number of nodes in the list.

This code fragment returns the number of elements in «books.xml»:

After the execution of the statement above, the value of x will be 4.

The length of the node list can be used to loop through all the elements in the list.

This code fragment uses the length property to loop through the list of elements:

Example

x = xmlDoc.getElementsByTagName(‘title’);
xLen = x.length;

for (i = 0; i elements

DOM Attribute List (Named Node Map)

The attributes property of an element node returns a list of attribute nodes.

This is called a named node map, and is similar to a node list, except for some differences in methods and properties.

An attribute list keeps itself up-to-date. If an attribute is deleted or added, the list is automatically updated.

This code fragment returns a list of attribute nodes from the first element in «books.xml»:

After the execution of the code above, x.length = is the number of attributes and x.getNamedItem() can be used to return an attribute node.

This code fragment gets the value of the «category» attribute, and the number of attributes, of a book:

Класс DOMNodeList

Обзор классов

Свойства

Количество узлов в списке. Диапазон действительных индексов дочерних узлов находится в промежутке от 0 до length — 1 включительно.

Список изменений

ВерсияОписание
7.2.0Реализован интерфейс Countable и возвращает значение свойства length.

Смотрите также

Содержание

  • DOMNodeList::count — Получить количество узлов в списке
  • DOMNodeList::item — Получает узел с заданным индексом

User Contributed Notes 8 notes

If you want to recurse over a DOM then this might help:
/**
* PHP’s DOM classes are recursive but don’t provide an implementation of
* RecursiveIterator. This class provides a RecursiveIterator for looping over DOMNodeList
*/
class DOMNodeRecursiveIterator extends ArrayIterator implements RecursiveIterator <

public function __construct ( DOMNodeList $node_list ) <

$nodes = array();
foreach( $node_list as $node ) <
$nodes [] = $node ;
>

parent :: __construct ( $nodes );

public function getRecursiveIterator () <
return new RecursiveIteratorIterator ( $this , RecursiveIteratorIterator :: SELF_FIRST );
>

public function hasChildren () <
return $this -> current ()-> hasChildNodes ();
>

public function getChildren () <
return new self ( $this -> current ()-> childNodes );
>

You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards:

$els = $document->getElementsByTagName(‘input’);
for ($i = $els->length; —$i >= 0; ) <
$el = $els->item($i);
switch ($el->getAttribute(‘name’)) <
case ‘MAX_FILE_SIZE’ :
$el->parentNode->removeChild($el);
break;
case ‘inputfile’ :
$el->setAttribute(‘type’, ‘text’);
//break;
>
>

Note that $length is calculated (php5.3.2).
Iterating over a large NodeList may be time expensive.

Prefer :
$nb = $nodelist->length;
for($pos=0; $pos length; $pos++)

I had a hard time figuring that out.

I have done some testing and have found 2 results:
(My System: Win XP with PHP 5.2.1)

1) Iteration with foreach does function correctly as «james dot j dot hackett at gmail dot com» writes, _if_ you only do readonly stuff with foreach or minor writings of some attributes.

2) foreach does not function, if you are doing some DOM-Operations while iterating. In my situation it was adding the iterated $node as an child to an new node:

$newNode = $dom->createElement(‘newNode’) ;
foreach ($nodeList as $node) <
echo $node->nodeValue ;
$newNode->appendChild($node) ;
>

This only gives you the first element .

I’m interpreting it as an confusing but correct behavior because of the changes within the $dom-object while appending the node at an additional place .

So, if you want to do something like 2) use for, length and item() 🙂

In PHP 5.2.5 (Windows) it is not possible to iterate correctly over the DOMNodeList object returned by DOMNode->childNodes using foreach. Instead I had to use the for loop in conjunction with the item() method of DOMNodeList for iterating over all child nodes correctly.

I don’t know whether this is really a bug, but apparently it is.

In Response to ‘kassah at gmail’

You don’t need to convert a DOMNodeList to an array in order iterate through it using ‘foreach’. You can use foreach directly with the DOMNodeList.

foreach ($nodeList as $node) <
echo $node->nodeValue;
>

That’s actually incorrect. You can use function results as objects. It makes building an API for your database very clean and neat. For example:

$articles = Node::screate(‘tags’, 123456)->assets(‘like:title:test’)->articles;

We use the above code to get articles that are linked to assets that are linked to a specific tag in our database.

Addition to my first note:

An traditional for-loop does not allow you to change the DOM-tree while looping — the effects are the nearly the same as with foreach. So you have to collect the nodes in an array and do the tree-altering stuff within a second loop (looping the array this time . )

Как передать данные из NodeJS в PHP

Представим приложение, в котором часть логики выполняется на NodeJS, а часть на PHP. Например, в нашем продукте для аналитики интернет-магазинов мы создали микросервис, который собирает информацию о товарах с сайтов клиентов. Часть приложения, которая качает файлы и хранит информацию о товарах, написана на PHP, а парсинг страниц на NodeJS.

Как обеспечить передачу данных из NodeJS в PHP?

Один из способов сделать это — использовать библиотеку dnode, которая обеспечивает передачу данных по протоколу RPC .

Для начала установим нужные модули на ноду и библиотеку dnode для php с помощью композера:

Со стороны NodeJS

Теперь напишем простой процесс, который запускает сервер dnode с методом parse(), который принимает два параметра — текст документа и коллбек, в который мы отдадим результат парсинга:

Теперь этот файл можно запустить и он станет процессом, который будет слушать порт 7070:

Со стороны PHP

Теперь всё, что осталось это скачать страничку с Хд и передать её ноде:

В выводе мы получим такой результат от парсера на ноде:

В итоге мы получили приложение, часть которого работает на NodeJS, а часть на PHP. При этом мы обращаемся к ноде, вызвав метод сервера и передав в него нужные параметры, а транспортом параметров и результатов занимается dnode.

Также благодаря своему протоколу мы можем обращаться к серверу на NodeJS из сервисов написанных на других языках, например, Ruby или Python, или настроить общение двух серверов на ноде.

Кстати, если вам нужна более простая, но быстрая библиотека для работы с dnode на PHP, используйте dnode-php-sync-client. И не забывайте следить за демонами с помощью правильных инструментов, например, forever.

Улучшение производительности PHP приложений

Анализ медленных PHP скриптов с помощью XHprof

Простое развертывание приложений и сервисов при помощи Subversion

Развертывание небольших веб-приложений и сервисов с помощью Git

Асинхронные задачи для оптимизации скорости сайта

Фоновое выполнение в PHP с помощью fastcgi_finish_request

Как включить хранение PHP сессий в Memcache

Запуск и контроль PHP демона (фоновый процесс) для использования в очередях сообщений

Чем вызвана ошибка PHP: exec(): Unable to fork и как ее исправить

Как настроить Nginx + PHP 7

Как эффективно использовать цикл foreach в PHP

Как работать с Vertica из PHP с модулем ODBC

Minification of JS/CSS/HTML in PHP

Короткие подсказки для создания быстрых PHP приложений

Методы асинхронных вызовов в PHP

Правильный подход для кэширования тяжелых запросов

Пример использования очередей на основе Gearman и PHP

Что такое отказоустойчивость и как ее реализовать в PHP-приложениях

Немного о том, что такое singleton и как подключиться к MySQL с помощью него.

Как настроить веб-сервер Nginx для работы с Magento

NodeList

На этой странице

Объект NodeList — это коллекция узлов, возвращаемая такими методами, как Node.childNodes и document.querySelectorAll .

Несмотря на то, что NodeList не является массивом ( Array ), его вполне возможно перебрать при помощи метода forEach(). NodeList также можно конвертировать в Array при помощи Array.from()

Однако некоторые старые браузеры на данный момент все еще не поддерживают NodeList.forEach() или Array.from() . Данные ограничения можно обойти, используя Array.prototype.forEach() ( больше информации на этой странице ).

Свойства

Методы

Описание

Динамическая коллекция

В определённых случаях NodeList может являться динамической коллекцией. Это означает, что любые изменения в DOM тут же отражаются на коллекции. Примером подобной коллекции является Node.childNodes :

В других случаях NodeList является статической коллекцией. Это означает, что любые изменения в DOM не отражаются на его содержании. К примеру, document.querySelectorAll возвращает статический NodeList .

Данное деление необходимо иметь в виду при выборе способа обхода элементов NodeList , а также сохранении длины списка в переменную.

Отличия NodeList от Array

NodeList используется подобно массивам, и потому может возникнуть закономерное желание использовать в нём методы, предоставляемые Array.prototype . Однако NodeList не реализует методы, подобные таковым у Array .

В JavaScript существует механизм наследования, основанный на прототипах, применяемый как к встроенным («native») (таким как Array ), так и «host»-объектам, предоставляемым средой исполнения (таким как NodeList ) . Экземпляры класса Array получают свои методы (к примеру, forEach и map ) из следующей цепочки наследования:

myArray —> Array.prototype —> Object.prototype —> null (Цепочка прототипов объекта может быть получена рекурсивным вызовом Object.getPrototypeOf )

forEach , map , ровно как и все остальные свойства принадлежат Array.prototype .

Цепочка же прототипов NodeList выглядит следующим образом:

myNodeList —> NodeList.prototype —> Object.prototype —> null

NodeList.prototype содержит метод item , но никак не остальные методы Array.prototype , поэтому они и не могут быть использованы с NodeLists .

Обходные пути

Один из способов решения данной проблемы — это копирование методов из Array.prototype в NodeList.prototype . Однако необходимо отдавать себе отчёт в том, что расширение объектов DOM опасно, особенно в старых версиях Internet Explorer (6, 7, 8).

Другой подход — расширение непосредственно объектов DOM:

Стоит отметить, что передача объектов среды (такого как NodeList ) через this native-методу (такому как forEach ) гарантированно работает не во всех браузерах и точно не работает в некоторых.

Пример

Элементы в NodeList , можно обработать следующим образом:

Не следует использовать конструкции for. in или for each. in для перечисления элементов списка. Эти способы также перечислят и свойства length и item , что приведёт к логическим ошибкам в случае, если скрипт ожидает только объекты node . Также for..in может перечислять свойства в любом порядке.

Циклы for. of корректно перечисляют все объекты внутри NodeList в браузерах, в которых поддерживается for. of (например, Firefox 13 или выше):

Конвертирование NodeList в Array

Иногда удобнее работать с содержимым NodeList , используя методы Array . Ниже приведена техника преобразования NodeList к Array :

Читать еще:  Mysqli extension for php
Ссылка на основную публикацию
Adblock
detector