2011-05-10 355 views
22

我使用这个删除XML版本标签时,在PHP

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

创建XML创建一个XML增加一些属性在此之后,当我尝试打印它看起来像这样 ,

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

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

+1

整个序言或只是版本信息? – Gordon 2011-05-10 09:10:18

+1

整个序言 – Dhiraj 2011-05-10 09:11:54

+1

为什么?这可能毫无意义,但不应该造成任何伤害。 – Quentin 2011-05-10 09:12:58

回答

33

理论上,您可以在保存文档时提供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); 
+0

谢谢你提供完美的答案 – Simer 2016-01-05 05:04:42

+3

要小心,这是逃避非ASCI字符进入。 – Ivan 2016-06-14 16:39:37

8

一个切实可行的解决方案:您知道结果字符串中第一次出现?>将会是xml版本子字符串的结尾。所以:

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

注意?>被分成两个部分,否则一些语法高亮差可能在这一点上解析的问题。

0

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

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

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

2

有没有更换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> 
9

我有一个simmilar解决了接受的答案:

如果您对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

2

由于SimpleXMLElement总是使用"\n"到XML的宣言从文档的其余部分分开,它可以在该位置进行分割,并采取其余:

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> 
4

尝试:

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

这对我需要做的事很好。 – Chad 2016-01-23 05:31:23

1
echo preg_replace("/<\\?xml.*\\?>/",'',$doc->saveXML(),1); 
+0

这几乎就是我正在做的。我的解决方案:'return preg_replace(“/ <\?xml.+?\?> /”,“”,$ doc-> asXml());'' – 2016-12-20 20:57:27

0
$customXML = new SimpleXMLElement('<source><abc>hello</abc></source>'); 
$result = $customXML->xpath('//abc'); 
$result = $result[0]; 
var_dump($result->asXML());