2011-05-10 8 views
22

Estoy creando un xml usando estequitar la etiqueta xml version cuando se crea un xml en php

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

después de añadir algunos atributos a esto, cuando trato de imprimir aparece como este,

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

¿Hay alguna manera de eliminar el nodo de la versión xml? Gracias

+1

todo el prólogo o simplemente la información de versión? – Gordon

+1

todo el prólogo – Dhiraj

+1

¿Por qué? Puede ser inútil, pero no debería hacer ningún daño. – Quentin

Respuesta

33

En teoría, puede proporcionar el LIBXML_NOXMLDECL option para soltar la declaración XML al guardar un documento, pero esto solo está disponible en Libxml> = 2.6.21 (y buggy). Una alternativa sería usar

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

Gracias por la respuesta perfecta – Simer

+3

Tenga cuidado, esto se está escapando de caracteres no ASCI a enitites. – Ivan

8

Una solución práctica: usted sabe que la primera aparición de ?> en la cadena de resultados va a ser entonces el final de la subcadena de la versión xml. Por lo tanto:

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

Tenga en cuenta que ?> se divide en dos partes porque de lo contrario algún pobre resaltador de sintaxis puede tener problemas de análisis sintáctico en este punto.

0

Si esto es un problema, esto debe hacerlo:

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

etiquetas de cabecera XML y las etiquetas cortas de PHP son incompatibles. Por lo tanto, esto puede ser un problema de uso de las etiquetas cortas en PHP (es decir, <?= en lugar de <?php echo...). Por lo tanto, desactivar las etiquetas cortas en PHP.INI (y actualizar su código adecuadamente) puede resolver este problema.

2

Hay otra manera sin reemplazar el encabezado xml.Yo prefiero esta:

$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); 

da salida:

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

tengo una solución del mismo tipo que la respuesta aceptada:

Si ha xml allready cargado en una variable:

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

Para el archivo XML del disco:

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

Este comentario ayudó: http://www.php.net/manual/en/domdocument.savexml.php#88525

2

Como SimpleXMLElement siempre utiliza "\n" para separar el XML-Declaración del resto del documento, que se puede dividir en esa posición, y el resto de la toma:

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

Ejemplo:

<?php 

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

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

de salida:

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

Probar:

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

Esto funciona bien para lo que tengo que hacer. – Chad

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

Esto es casi exactamente lo que estoy haciendo. Mi solución: 'return preg_replace ("/<\?xml.+?\?>/"," ", $ doc-> asXml());' –

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