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
Смотрите ссылку для дополнительных опций, вы можете использовать один или другой в будущем.