Как правильно создать класс потомок для DOMDocument ?

alekciy

Новичок
Как правильно создать класс потомок для DOMDocument ?

Apache/2.0.52 (Win32) PHP/5.2.3

Не могу понят почему не получается создать класс потомок. Пример:
PHP:
<?php
class XML extends DOMDocument
{
    function __construct($xml_file)
    {
        parent::load($xml_file);
    }
};

$doc = new XML('xml.xml');
$doc->saveXML();
?>
Получаю в браузере пусто. В то время как имеется такой вот скрипт который отлично работает:
PHP:
<?php
class DOMDocumentStylesheet extends DOMDocument {

    function __construct($xml_file,$href_stylesheet)
    {
            $handle = fopen($xml_file, "r");
            $contents = fread($handle, filesize($xml_file));
            //т.к. далее в регулярке наличие символа < в начале строки приводит к зависанию, то его вырезаем
            $contents = mb_substr($contents,1);
            fclose($handle);
            preg_match("/\?xml\s.+\?>/",$contents,$matches);
            $contents = str_replace($matches[0],'<'.$matches[0].'<?xml-stylesheet type="text/xsl" href="'.$href_stylesheet.'"?>',$contents);
            parent::loadXML($contents);
        };
    }

};

$xml = new DOMDocumentStylesheet('xml.xml','xslt-template/draw_xml_tree.xsl');
$xml->validateOnParse = true;
$xml->preserveWhiteSpace = false;

header('Content-Type: application/xml');
echo $xml->saveXML();
?>
Если же для первого примера прописать header, то браузер выдает ошибку:
Ошибка синтаксического анализа XML: элемент не найден
Строка 1, символ 1:

В чем может быть дело?

-~{}~ 14.08.07 18:50:

Кстати. В обоих случаях загружается один и тот же XML файл.
parent::load($xml_file) дает true.
 

slach

Новичок
ну кроме указания на то, что в конструкторе наверное не следует делать вызов parent::load вообще

а лучше сделать эту инициализацию ОТДЕЛЬНЫМ методом

могу еще подкинуть ссылок
http://devzone.zend.com/node/view/id/1713#Heading11

-~{}~ 15.08.07 11:35:

PHP:
class Articles extends DomDocument {
  function __construct() {
        //не забываем вызвать конструктор родителя
        parent::__construct();
 }
}
 

alekciy

Новичок
slach
Спасибо, теперь разобрался.

А почему не стоит делать вызов parent::load в консрукторе? Я точно знаю, что буду работать только с уже созданными файлами поэтому смысла делать вызов метода загрузки XML файла в основном коде я не увидел и решил это вынести в контруктор.
 

slach

Новичок
ну, на самом деле можно конечно
но перед этим обязательно вызывать parent::__contruct
чтобы все libxml структуры в памяти были проинициализированы правильно

а кроме встроенного в конструктор load
какие еще расширения DOMDocument планируются?

мож оно того не строит??

обычно я инициализирую загрузку из уже созданного файла вот так

$dom = DOMDocument::load('file.xml');

кроме того
в вашем случае цель шаманства в виде str_replace
мне тоже не сильно понятна

может лучше (и идеологически правильнее) заменить нужную Processing Instruction и XML декларацию средствами DOM???
http://www.php.net/manual/en/function.dom-domdocument-createprocessinginstruction.php

$dom->appendChild($dom->createProcessingInstruction(
'xml-stylesheet', 'href="test.xsl" type="text/xsl"'));
 

alekciy

Новичок
slach
>а кроме встроенного в конструктор load
>какие еще расширения DOMDocument планируются?
Из DOMDocument скорее всего ни каких больше (разве только createElement). Но хочу сделать наследование именно потому, что планирую добавить пару методов. В частности более компактное создание элементов/атрибутов, собрав вместе createElement/createAttribute/appendChild/, ну и еще автоматическое создание XPath объекта.

Поэтому, имхо, оно того стоит.

>может лучше (и идеологически правильнее) заменить
>нужную Processing Instruction и XML декларацию средствами DOM???
Безусловно это и лучше и правильнее. Но причина шаманства банальна - незнание. Я точно знал, что в наборе функций нет готового механизма работы со стилями. А сделать такую декларацию через инструкции обработки я в тот момент не догадался потому как с инструкциями обработки до этого в практике не сталкивался вот и не сообразил подойти с этой стороны.
Поэтому спасибо! Безусловно эту часть кода я перепишу.
 
Сверху