像这样的简单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();
?>
Give me error:
警告:DOMDocument::loadXML(): XML声明只允许在Entity文档的开头,line: 5
因为loadXML()方法会自动将声明添加到内容中,但是我需要像上面那样在最后的模板中注入部分xml。如何禁用这个恼人的自动添加,让我使用我的声明?还是有别的办法来解决这个问题?
如果您不喜欢这个错误,并且您想保存您想要合并的文档而不需要XML声明,则只需保存document元素而不是整个文档。
在下面的示例代码(online-demo)中查看这两个变体:
$doc = new DOMDocument();
$doc->loadXML('<root><child/></root>');
echo "The whole doc:nn";
echo $doc->saveXML();
echo "nnThe root element only:nn";
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
(integer)保存文档时删除XML声明
注意:仅可在Libxml祝辞= 2.6.21
: http://php.net/libxml.constants
请参阅链接以获取其他选项,您可能希望将来使用其中一个