2010-07-09 18 views
17

Tengo este código básico.Necesita escribir XML usando PHP, ¿cómo?

<chart lowerLimit='0' upperLimit='100' caption='Revenue' subcaption='US $ (1,000s)' numberPrefix='$' numberSuffix='K' showValue='1' > 
    <colorRange> 
     <color minValue='0' maxValue='50' color='A6A6A6'/> 
     <color minValue='50' maxValue='75' color='CCCCCC'/> 
     <color minValue='75' maxValue='100' color='E1E1E1'/> 
    </colorRange> 
    <value>78.9</value> 
    <target>80</target> 
</chart> 

se usa en fusionwidgets y no hay documentación sobre cómo escribir esto en PHP.

¿alguien puede aconsejar?

Respuesta

33

Existe ejemplo completo con php.net/XMLWriter para producir exactamente la misma salida XML como informados.

<?php 
$writer = new XMLWriter(); 
$writer->openURI('php://output'); 
$writer->startDocument('1.0','UTF-8'); 
$writer->setIndent(4); 
$writer->startElement('chart'); 
    $writer->writeAttribute('lowerLimit', '0'); 
    $writer->writeAttribute('upperLimit', '100'); 
    $writer->writeAttribute('caption', 'Revenue'); 
    $writer->writeAttribute('subcaption', 'US $ (1,000s)'); 
    $writer->writeAttribute('numberPrefix', '$'); 
    $writer->writeAttribute('numberSuffix', 'K'); 
    $writer->writeAttribute('showValue', '1'); 
    $writer->startElement('colorRange'); 
     $writer->startElement('color'); 
     $writer->writeAttribute('minValue', '0'); 
     $writer->writeAttribute('maxValue', '50'); 
     $writer->writeAttribute('color', 'A6A6A6'); 
     $writer->endElement();  
     $writer->startElement('color'); 
     $writer->writeAttribute('minValue', '50'); 
     $writer->writeAttribute('maxValue', '75'); 
     $writer->writeAttribute('color', 'CCCCCC'); 
     $writer->endElement(); 
     $writer->startElement('color'); 
     $writer->writeAttribute('minValue', '75'); 
     $writer->writeAttribute('maxValue', '100'); 
     $writer->writeAttribute('color', 'E1E1E1'); 
     $writer->endElement(); 
    $writer->endElement(); 
    $writer->writeElement('value','78.9'); 
    $writer->writeElement('target','78.9'); 
$writer->endElement(); 
$writer->endDocument(); 
$writer->flush(); 
?> 
+5

Por cierto. '\ XmlWriter :: setIndent()' trata su parámetro como bool. Simplemente habilita la sangría (usando un espacio) en lugar de escribir todo el XML en una línea. Ver http://php.net/manual/de/function.xmlwriter-set-indent.php. – flu

1

SimpleXML, que está integrado en PHP es la solución más simple para escribir (y analizar) XML. http://php.net/manual/en/book.simplexml.php

+1

Se debe tener en cuenta que SimpleXml es simple porque tiene la menor funcionalidad Las otras librerías son más potentes y ofrecen más control sobre el XML. – Gordon

8

Mi forma favorita de escribir archivos XML es XMLWriter - http://php.net/xmlwriter. Es muy poderoso y simple de usar.

<?php 
      $writer = new XMLWriter(); 
      $writer->openURI('php://output'); 
      $writer->startDocument('1.0','UTF-8'); 
      $writer->setIndent(4); 
      $writer->startElement('items'); 
      $writer->startElement("main"); 
      $writer->writeElement('user_id', 3); 
      $writer->writeElement('msg_count', 11); 
      $writer->endElement(); 
      $writer->startElement("msg"); 
      $writer->writeAttribute('category', 'test'); 
      $writer->endElement();  
      $writer->endElement(); 
      $writer->endDocument(); 
      $writer->flush(); 
    ?> 

Y ese trozo de código producirá el siguiente código XML:

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
<main> 
    <user_id>3</user_id> 
    <msg_count>11</msg_count> 
</main> 
<msg category="test"/> 
</items> 
1

Con FluidXML puede generar su XML de esta manera.

$chart = fluidxml('chart'); 

$chart->attr('lowerLimit', 0) 
     ->attr('upperLimit', 100) 
     ->attr(...) 
     ->add('colorRange') 
     ->add('value', 78.9) 
     ->add('target', 80) 
     ->query('//colorRange') 
      ->add('color', ['minValue' => 0, 'maxValue' => 50, ...]) 
      ->add('color', ['minValue' => 50, 'maxValue' => 75, ...]) 
      ->add('color', ['minValue' => 75, 'maxValue' => 100, ...]); 

https://github.com/servo-php/fluidxml

+0

Se le informará que no es compatible con PHP 5.x – gaRex

+1

FluidXML en la última versión admite ** PHP 5 **. –

+0

¡Buen trabajo, Daniele! – gaRex

1

Como se ha mencionado antes, setIndent establece muesca en y deben usarse como esto:

$writer->setIndent(true); 

si desea establecer el tamaño de la sangría a una diferente de la predeterminada (2 espacios), puede usar setIndentString:

$writer->setIndentString(" "); 
Cuestiones relacionadas