Зацените класс для работы с XML/DOM

[Удален]
922

http://demos.uskoff.com/dome/

Вся информация пока только на английском.

Здесь на русском вкратце суть:

Существующие в PHP5 два класса (SimpleXML и DOMDocument) не устраивают меня по ряду причин. Основные из них - первый позволяет только читать и немного редактировать существующие документа, а второй, хоть и позволяет создавать их с нуля, имеет слишком низкоуровневый апи и код с его использованием очень громоздкий и малочитаемый.

По сей причине я решил сделать обертку для DOMDocument, которая взяла бы в себя все лучшее от SimpleXML и от js-фреймворка Prototype, сильной стороной которого всегда была работа с DOM.

Краткий список возможностей:

  • Удобное обращение к узлам с помощью геттеров - как в SimpleXML. Например

  • $document->element[2]->name; //таким образом получается ссылка на узел.
    //Если обратиться к ней как к строке, то получите содержимое элемента.
    $document->some_node->subnode[4]->sub_subnode;

    $document->element->attrs(); //возвращает ассоциативный массив 'имя'=>'значение'
  • Удобное добавление/замена узлов

  • $document->element->append('sub_element','sample content');
    $document->node[4]->append('sub_node',array(
    'value'=>'any html <b>data</b> here',
    'cdata'=>'1',
    'attributes'=>array(
    'attr1'=>'value1',
    'attr2'=>'value2'
    )
    )
    );
  • Удобное изменение содержимого и свойств узлов

  • $doc=new DOMEDoc('root');
    $doc->root->append('node','Сначала такое значение')->
    append('subnode','И вложенный элемент');
    $doc->node->update("Теперь <i>html</i> код",true);
    $doc->node->update("Теперь снова обычный текст");
    $doc->node->set('аттрибут','значение')->set('еще атрибут','значение')->
    set('и еще аттрибут','значение');
    $doc->node->update('А так можно обновить содержимое целиком,
    заменяя не только текст узла, но и удаляя всех прочих потомков',0,true);
  • Поддержка прямого вызова xpath к любому элементу. Причем можно использовать как поиск элементов, так и вычисление count() или подобных одной и той же функцией.
  • Легкая загрузка существующих документов

  • $doc=new DOMEDoc(file_get_contents("любой xml или html ресурс"));

В общем для парсеров, для создания RSS, и для многих других целей самое то. Очень надеюсь что будете пользоваться, отзываться, комментировать, репортить баги и высказывать прочие пожелания.

Давайте так - вопросы здесь, а репорты и пожелания на me@uskoff.com. Что будет интересного - я буду выкладывать здесь.

ewg777
На сайте с 04.06.2007
Offline
225
#1

Что-то PHPdoc блоки не информативны. Да и подобный стиль кода не поддерживаю.

public function xpath($query)
{
$res=NULL;

Простите, но для чего это?

if ($this->root===NULL)
is_null - плох?
[Удален]
#2

PHPDoc я еще собсно и не делал. Комменты поставил себе чтобы быстро искать.

В DOMDocument как бы нет встроенного xpath'а, нужно создавать объект DOMXPath и вызывать либо evaluate либо query в зависимости от того, что хотите получить.. Здесь же все сделано за вас. функция xpath определена и для экземпляра документа, и для экземпляра элемента (в этом случае запрос будет относительный), и сама определяет ожидаемое значение и вызывает нужный метод. Вопрос только в том, насколько точно =)

А про какой стиль кода вы говорите? Про сами функции или про способ их использования?

neolord добавил 25.09.2009 в 19:56

ewg777:
is_null - плох?

да нет, не вижу разницы просто. Хотя по идее функции is_* используются для проверки типа, а оператор === и типа и значения. В данном случае конечно все равно, просто мало ли я захочу дефолтное значение $root изменить =) Меньше править

Я в общем то не считаю что споры по исходному коду актуальны, мне больше интересно что вы думаете о конечном удобстве

ewg777
На сайте с 04.06.2007
Offline
225
#3
В DOMDocument как бы нет встроенного xpath'а, нужно создавать объект DOMXPath и вызывать либо evaluate либо query в зависимости от того, что хотите получить.. Здесь же все сделано за вас. функция xpath определена и для экземпляра документа, и для экземпляра элемента (в этом случае запрос будет относительный), и сама определяет ожидаемое значение и вызывает нужный метод. Вопрос только в том, насколько точно =)

Я о том, что в начале метода $res=NULL;

А про какой стиль кода вы говорите?

Как бы существуют стандарты оформления PHP кода.

К примеру скобки


if (is_array($params))
{
if (isset($params['nsURI']))
$nsURI=$params['nsURI'];
if (isset($params['value']))
{
if (!isset($params['cdata']) || !$params['cdata'])
$value=$params['value'];
}
}
if (is_string($params))
$value=$params;

А конструкция if ($this->root===NULL) равносильна if (is_null ($this->root))

мне больше интересно что вы думаете о конечном удобстве
Это решит конечный пользователь
Давайте закроем тему сорцов.
Без проблем. Для себя так для себя.
[Удален]
#4
ewg777:
Я о том, что в начале метода $res=NULL;

а что плохого в дефолтных значениях переменных? если я добавлю какие нибудь манипуляции кроме присваивания, будет E_NOTICE без этого

ewg777:
Как бы существуют стандарты оформления PHP кода.

Ну как бы мне на них с высокой колокольни. Еще раз уточню - код самого класса предназначен для меня и только для меня - я его делаю как мне удобней. Если бы это был не php, а си, вы бы даже не узнали что там у класса внутри. Оценивайте интерфейс а не реализацию.

ewg777:
А конструкция if ($this->root===NULL) равносильна if (is_null ($this->root))

Если я хочу чтобы root в начале был скажем не null а false, то в первой конструкции мне поменять 5 букв, а во второй убрать функцию, скобки, дописать равно и те же 5 букв. Давайте закроем тему сорцов.

[Удален]
#5

Апдейт:

Добавлен шорткат для функции removeChild для вызова "цепочкой", а также я сделал пару показательных примерчиков, подчеркивающих удобство объектно-ориентированного подхода для решения задач парсинга

http://demos.uskoff.com/dome/doc/en/Solutions/

Чуть позже добавлю примеры того, как этот класс позволяет легко создавать различные фиды, типа RSS.

[Удален]
#6

типа RSS позволяет удобно создавать вот эта штука, особенно она удобна при PHP IDE поддерживающей PHPDoc.

DudeFeed 0.1 Beta. Процессор новостных лент.

[Удален]
#7

ну да, вроде ниче =) Хотя я предпочел бы использовать передачу одной записи в виде массива. Это например минимизировало бы код при выгрузке из базы через fetch_array/fetch_assoc

Я в общем то не пытаюсь конкурировать с твоими проектами =) Это исключительно вопрос предпочтений.

[Удален]
#8

neolord, мне по***, я предпочитаю удобочитабельный вид + обработчики ошибок последнее время, поэтому и пишу такие классы. короче управляемый код - хорошо!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий