DOMDocument::loadXML() для частей XML

Простые шаблоны XML, подобные этим:

Structure.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<document>
<book>first book</book>
<book>second book</book>
((other_books))
</document>

book_element.xml:

<book>((name))</book>

И этот тест:

    <?php
Header("Content-type: text/xml; charset=UTF-8");
class XMLTemplate extends DOMDocument
{
    private $_content_storage;
    private $_filepath;
    private $_tags;

    public function XMLTemplate( $sFilePath )
    {
        if( !file_exists( $sFilePath ) ) throw new Exception("file not found");

        $this->_filepath = $sFilePath;
        $this->_tags = [];
        $this->_content_storage = file_get_contents( $this->_filepath );
    }

    public function Get()
    {
        $this->merge();
        $this->loadXML( $this->_content_storage );
        return $this->saveXML();
    }

    public function SetTag( $sTagName, $sReplacement )
    {
        $this->_tags[ $sTagName ] = $sReplacement;  
    }

    private function merge()
    {
        foreach( $this->_tags as $k=>$v)
        {
            $this->_content_storage = preg_replace(
                "/\({2}". $k ."\){2}/i",
                $v,
                $this->_content_storage
            );
        }
        $this->_content_storage = preg_replace(
            "/\({2}[a-z0-9_\-]+\){2}/i",
            "",
            $this->_content_storage
        );
    }
}

$aBooks = [
    "troisième livre",
    "quatrième livre"   
];

$Books = "";

foreach( $aBooks as $bookName )
{
    $XMLBook = new XMLTemplate("book_element.xml");
    $XMLBook->SetTag( "name", $bookName );
    $Books .= $XMLBook->Get();
}

$XMLTemplate = new XMLTemplate("test.xml");

$XMLTemplate->SetTag("other_books", $Books);
echo $XMLTemplate->Get();
?>

Дай мне ошибку:

Предупреждение: DOMDocument::loadXML(): объявление XML разрешено только в начале документа в Entity, строка: 5

Потому что метод loadXML () автоматически добавляет объявление к содержимому, но мне нужно добавить части xml в окончательный шаблон, как описано выше. Как отключить это надоедливое автоматическое добавление и разрешить мне использовать мое объявление? Или другая идея, чтобы искоренить проблему?

1 ответ

Если вам не нравится ошибка, и вы хотите сохранить документ, который вы хотите объединить, без объявления XML, просто сохраните элемент документа вместо всего документа.

Смотрите оба варианта в следующем примере кода ( онлайн-демонстрация):

$doc = new DOMDocument();
$doc->loadXML('<root><child/></root>');

echo "The whole doc:\n\n";
echo $doc->saveXML();

echo "\n\nThe root element only:\n\n";
echo $doc->saveXML($doc->documentElement);

Вывод следующий:

The whole doc:

<?xml version="1.0"?>
<root><child/></root>


The root element only:

<root><child/></root>

Это, вероятно, должно быть уже полезно для вас. Кроме того, существует константа для libxml, которая, как говорят, может использоваться для управления выводом объявления XML. Но я никогда не использовал это:

LIBXML_NOXMLDECL (Целое число)

Удалите объявление XML при сохранении документа

Примечание. Доступно только в Libxml >= 2.6.21.

От: http://php.net/libxml.constants

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

Другие вопросы по тегам