在 php 中创建 xml 时删除 xml 版本标记

Posted

技术标签:

【中文标题】在 php 中创建 xml 时删除 xml 版本标记【英文标题】:remove xml version tag when a xml is created in php 【发布时间】:2011-08-22 07:20:52 【问题描述】:

我正在使用它创建一个 xml

$customXML = new SimpleXMLElement('<abc></abc>');

在添加一些属性之后,当我尝试打印它时 看起来像这样,

<?xml version="1.0"?>
<abc id="332"><params><param name="aa">33</param></params></abc>

有没有办法删除 xml 版本节点? 谢谢

【问题讨论】:

整个序言还是只是版本信息? 为什么?这可能毫无意义,但不应该造成任何伤害。 【参考方案1】:

一个实用的解决方案:你知道?&gt; 在结果字符串中的第一次出现将是 xml 版本子字符串的结尾。所以:

$customXML = new SimpleXMLElement('<abc></abc>');
$customXML = substr($customXML, strpos($customXML, '?'.'>') + 2);

请注意,?&gt; 被分成两部分,否则一些糟糕的语法高亮可能会在此时出现解析问题。

【讨论】:

【参考方案2】:

如果这是一个问题,应该这样做:

$xml = str_replace(' version="1.0"', '', $xml);`

【讨论】:

【参考方案3】:

XML 标头标签和 php 短标签不兼容。因此,这可能是在 PHP 中使用短标签的问题(即&lt;?= 而不是&lt;?php echo...)。因此,关闭 PHP.INI 中的短标签(并适当更新您的代码)可能会解决此问题。

【讨论】:

【参考方案4】:

理论上,您可以提供LIBXML_NOXMLDECL option 以在保存文档时删除 XML 声明,但这仅适用于 Libxml >= 2.6.21(和 buggy)。另一种方法是使用

$customXML = new SimpleXMLElement('<abc></abc>');
$dom = dom_import_simplexml($customXML);
echo $dom->ownerDocument->saveXML($dom->ownerDocument->documentElement);

【讨论】:

感谢您的完美回答 小心,这是将非 ASCI 字符转义为 enitites。【参考方案5】:

还有另一种不用替换 xml 标头的方法。我更喜欢这个:

$xml = new xmlWriter();
$xml->openMemory();
$xml->startElement('abc');
$xml->writeAttribute('id', 332);
$xml->startElement('params');
$xml->startElement('param');
$xml->writeAttribute('name', 'aa');
$xml->text('33');
$xml->endElement();
$xml->endElement();
echo $xml->outputMemory(true);

给出输出:

<abc id="332"><params><param name="aa">33</param></params></abc>

【讨论】:

【参考方案6】:

对于已接受的答案,我有一个类似的解决方案:

如果您已经在变量中加载了 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

【讨论】:

【参考方案7】:

由于SimpleXMLElement 总是使用"\n" 将XML-Declaration 与文档的其余部分分开,因此可以在该位置拆分它并取其余部分:

explode("\n", $customXML->asXML(), 2)[1];

例子:

<?php

$customXML = new SimpleXMLElement('<!-- some comment -->
<abc>
</abc>');

echo explode("\n", $customXML->asXML(), 2)[1];

输出:

<!-- some comment -->
<abc>
</abc>

【讨论】:

【参考方案8】:

试试:

$xmlString = $doc->saveXML();
$xmlString = str_replace("<?xml version=\"1.0\"?>\n", '', $xmlString);
file_put_contents($filename, $xmlString);

【讨论】:

【参考方案9】:
echo preg_replace("/<\\?xml.*\\?>/",'',$doc->saveXML(),1);

【讨论】:

这几乎正是我正在做的。我的解决方案:return preg_replace( "/&lt;\?xml.+?\?&gt;/", "", $doc-&gt;asXml() );【参考方案10】:
$customXML = new SimpleXMLElement('<source><abc>hello</abc></source>');
$result = $customXML->xpath('//abc');
$result = $result[0];
var_dump($result->asXML());

【讨论】:

以上是关于在 php 中创建 xml 时删除 xml 版本标记的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中创建/编写 XML 文件?

在 ServletContext 资源 [/WEB-INF/applicationContext-db.xml] 中创建名称为“flyway”的 bean 时出错

在 Java DOM 中创建以命名空间为前缀的 XML 节点

在 STS 中创建 spring starter 时 POM.xml 出错

在 XML 中创建文本节点时避免转义字符实体引用

在java中创建XML文件时传递字符串而不是节点