1

像这些简单的 XML 模板:

结构.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 声明只允许在实体中文档的开头,行:5

因为 loadXML() 方法会自动将声明添加到内容中,但我需要像上面一样在最终模板中注入部分 xml。如何禁用这种烦人的自动添加并让我使用我的声明?或者另一个想法来解决问题?

4

1 回答 1

1

如果您不喜欢该错误并且想要在没有 XML 声明的情况下保存要合并的文档,只需保存文档元素而不是整个文档。

请参阅以下示例代码 ( online-demo ) 中的两种变体:

$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

有关其他选项,请参阅链接,您将来可能希望使用其中一个。

于 2013-03-20T15:19:46.577 回答