在 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】:一个实用的解决方案:你知道?>
在结果字符串中的第一次出现将是 xml 版本子字符串的结尾。所以:
$customXML = new SimpleXMLElement('<abc></abc>');
$customXML = substr($customXML, strpos($customXML, '?'.'>') + 2);
请注意,?>
被分成两部分,否则一些糟糕的语法高亮可能会在此时出现解析问题。
【讨论】:
【参考方案2】:如果这是一个问题,应该这样做:
$xml = str_replace(' version="1.0"', '', $xml);`
【讨论】:
【参考方案3】:XML 标头标签和 php 短标签不兼容。因此,这可能是在 PHP 中使用短标签的问题(即<?=
而不是<?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( "/<\?xml.+?\?>/", "", $doc->asXml() );
【参考方案10】:
$customXML = new SimpleXMLElement('<source><abc>hello</abc></source>');
$result = $customXML->xpath('//abc');
$result = $result[0];
var_dump($result->asXML());
【讨论】:
以上是关于在 php 中创建 xml 时删除 xml 版本标记的主要内容,如果未能解决你的问题,请参考以下文章
在 ServletContext 资源 [/WEB-INF/applicationContext-db.xml] 中创建名称为“flyway”的 bean 时出错
在 Java DOM 中创建以命名空间为前缀的 XML 节点