[英]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.