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();
?>

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

请参阅链接以获取其他选项,您可能希望将来使用其中一个

相关内容

  • 没有找到相关文章

最新更新