繁体   English   中英

PHP DomDocument output 无<!--?xml version="1.0" encoding="UTF-8"?-->

[英]PHP DomDocument output without <?xml version="1.0" encoding="UTF-8"?>

DomDocument 是否有删除第一行的选项:

<?xml version="1.0" encoding="UTF-8"?>

class 实例化自动将它添加到 output 中,但是有没有可能去掉它呢?

我认为使用 DOMDocument 是有效 XML 文件的通用解决方案:

如果您已经在变量中加载了 xml:

$t_xml = new DOMDocument();
$t_xml->loadXML($xml_as_string);
$xml_out = $t_xml->saveXML($t_xml->documentElement);

对于来自磁盘的 XML 文件:

$t_xml = new DOMDocument();
$t_xml->load($file_path_to_xml);
$xml_out = $t_xml->saveXML($t_xml->documentElement);

此评论有帮助: http : //www.php.net/manual/en/domdocument.savexml.php#88525

如果要输出 HTML,请使用saveHTML()函数。 它会自动避免大量 XML 习语并正确处理关闭/未关闭的 HTML 习语。

如果你想输出 XML,你可以使用DOMDocument是一个DOMNode的事实(即:XPath 表达式中的“/”),因此你可以使用DOMNode API 调用它来迭代子节点并在每个子节点上调用saveXML() . 这不会输出 XML 声明,而是正确输出所有其他 XML 内容。

例子:

$xml = get_my_document_object();
foreach ($xml->childNodes as $node) {
   echo $xml->saveXML($node);
}

您可以使用输出缓冲来删除它。 有点黑客,但它的工作原理。

ob_start();

// dom stuff

$output = ob_get_contents();
ob_end_clean();

$clean = preg_replace("/(.+?\n)/","",$output);

对我来说,上面的答案都没有奏效:

$dom = new \DOMDocument();
$dom->loadXXX('<?xml encoding="utf-8" ?>' . $content);  // loadXML or loadHTML
$dom->saveXML($dom->documentElement);

如果我有部分 HTML,以上对我不起作用,例如

<p>Lorem</p>
<p>Ipsum</p>

因为它然后删除了<p>Lorem</p>之后的所有内容。

对我有用的唯一解决方案是:

foreach ($doc->childNodes as $xx) {
    if ($xx instanceof \DOMProcessingInstruction) {
        $xx->parentNode->removeChild($xx);
    }
}

我有同样的问题,但我正在使用symfony/serializer来创建 XML。 如果您还想使用 Symfony 序列化器实现此目的,您可以这样做:

$encoder = new \Symfony\Component\Serializer\Encoder\XmlEncoder();

$encoder->encode($nodes[$rootNodeName], 'xml', [
    XmlEncoder::ROOT_NODE_NAME => $rootNodeName,
    XmlEncoder::ENCODING       => $encoding,
    XmlEncoder::ENCODER_IGNORED_NODE_TYPES => [
          XML_PI_NODE, //this flag is the solution
    ],
]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM