DOMDocument 避免初始 xml 标记

Posted

技术标签:

【中文标题】DOMDocument 避免初始 xml 标记【英文标题】:DOMDocument avoid initial xml tag 【发布时间】:2020-05-28 21:07:30 【问题描述】:

问题:

如何避免 DOMDocument 创建初始 xml-tag?:

<?xml version="1.0"?>

想要的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>My site</title>
  </head>
  <body>
  </body>
</html>

使用 DOMDocument 生成的代码:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>My site</title>
  </head>
  <body></body>
</html>

我的脚本:

<?php

/**
 * Ref:
 * https://***.com/questions/19482826/using-domdocument-to-create-elements-in-an-html-file
 * https://www.php.net/manual/en/domimplementation.createdocumenttype.php
 */

// Creates an instance of the DOMImplementation class
$imp = new DOMImplementation;

 // Doctype
 $dtd = $imp->createDocumentType(
   'html', '-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
 );

// Base document
$doc = $imp->createDocument("", "", $dtd);
$doc->formatOutput = true;


/**
 * Construct tag skeleton.
 */

// [L-1]
$html=$doc->appendChild(
  $doc->createElementNS("http://www.w3.org/1999/xhtml","html")
);

$html->setAttribute("lang", "en");
$html->setAttribute("xml:lang", "en");
$doc->appendChild($html);


    // [L-2]
    $head=$html->appendChild(
      $doc->createElement('head')
    );

        // [L-3]
        $title=$head->appendChild(
          $doc->createElement(
            'title',
            "My site"
          )
        );

    // [L-2]
    $body=$html->appendChild(
      $doc->createElement('body')
    );

// Save
echo $doc->saveHTML();
$doc->save("auto_produced_xhtml.xhtml");

【问题讨论】:

无法复制:3v4l.org/OYLG4 @Nick Wiewing 在 AOM 和 Firefox 浏览器中的代码我可以看到初始的 xml 标记。运行上面的脚本,看到终端的输出,我没有看到 xml-tag。 幸运的是@kerbholz 想出来了... 【参考方案1】:

您可以使用saveHTMLFile(); 代替save() 来...另存为HTML 文件。替换

$doc->save("auto_produced_xhtml.xhtml");

$doc->saveHTMLFile("auto_produced_xhtml.xhtml");

https://www.php.net/manual/en/domdocument.savehtmlfile.php

【讨论】:

以上是关于DOMDocument 避免初始 xml 标记的主要内容,如果未能解决你的问题,请参考以下文章

DOMDocument-防止空标记//检索没有xml声明的节点

警告:DOMDocument::loadXML():需要开始标记,在实体中找不到“<”

如何使用 DOMDocument 编写 XML 自闭标签

如何让 MySQL 返回 UTF-8?

如何在没有名称空间的情况下将XML字符串附加到DOMDocument

如何在没有 HTML 包装器的情况下保存 DOMDocument 的 HTML?