2010-12-16 20 views
5

Tengo una fila de base de datos que se ve así.¿Cómo fusiona dos documentos XML en PHP utilizando SimpleXML?

ID (int):  123 
Name (string): SomeName 
Data (string): <data><foo>one</foo></bar>two</bar></data> 

Necesito formatear esta información como XML de la siguiente manera.

<row> 
    <id>123</id> 
    <name>SomeName</name> 
    <data> 
    <foo>one</foo> 
    <bar>two</bar> 
    </data> 
<row> 

actualmente estoy usando SimpleXML para tratar de construir esto, pero no estoy seguro de cómo hacer para insertar el XML existente en el nuevo documento XML que estoy tratando de construir.

Si hay otros constructores XML estándar que vienen con PHP, estoy dispuesto a usarlos también. La concatenación de cadenas no es una respuesta aceptable.

Editar: Parece que SimpleXML no hará lo que necesito. Supongo que en este punto, necesito sugerencias para otros analizadores XML.

+1

por favor incluya ejemplo de su formato XML existente ** ** – ajreal

+1

posible duplicado de [SimpleXML: anexar un árbol a otro] (http://stackoverflow.com/questions/3418019/simplexml-append-one-tree- a-otro) – salathe

Respuesta

2
$xml = new SimpleXMLElement('<row></row>'); 
$xml->addChild('id', /*database ID column*/); 
$xml->addChild('name', /*database Name column*/); 

$data = new SimpleXMLElement(/*database Data column*/); 

$xml->addChild('data'); 
$xml->data->addChild('foo', $data->foo); 
$xml->data->addChild('bar', $data->bar); 

Probado y funciona. Debe ser trivial convertir esto a su aplicación real. Puede haber una forma más flexible de hacerlo, pero no soy consciente de ello. No lo llaman SimpleXML por nada :)

+2

No continúe esto. El XML de la base de datos tiene una estructura compleja. Necesito una forma general de hacer esto. Considere el XML de la base de datos para ser XML estructurado arbitrariamente. – haydenmuhl

+1

Entonces SimpleXML no lo cortará por usted. Necesitas PHP DOM. – Jonah

0
$xml = '<data><foo>one</foo><bar>two</bar></data>'; // your data field 

$row = new SimpleXMLElement('<row></row>'); // new row to inject your database fields into 
$data = new SimpleXMLElement($xml); // new object from your xml data field 

$row->id = '123'; // your id field 
$row->name = 'Somename'; // your name field 
$row->data->foo = $data->foo; // your foo record from your xml data field 
$row->data->bar = $data->bar; // your bar record from your xml data field 

$final_xml = $row->saveXML(); // restructure your xml file/string 
echo $final_xml; // <?xml version="1.0"?><row><id>123</id><name>Somename</name><data><foo>one</foo><bar>two</bar></data></row> 

Has probado este código y también funciona. Tendrá que crear dos objetos SimpleXml como la respuesta anterior. Aparte de eso, puede agregar elementos adicionales como agregar valores de clase. Se agregará un <?xml version="1.0"?> a la cadena/archivo xml final.

No estoy seguro si necesita el <?xml version="1.0"?>. Si no se puede llevar a cabo con:

$final_xml = str_replace("<?xml version=\"1.0\"?>\n",'',$final_xml); 

Se puede extraer de http://www.php.net/manual/en/simplexmlelement.asxml.php para obtener más información sobre volver a guardar objetos SimpleXML de nuevo a XML secuencias/archivos.

+1

También un no ir. Vea el comentario sobre la respuesta de Jonah Bron. – haydenmuhl

0
/** 
* Converts your record to XML. 
* 
* @param array/object $record 
* @return SimpleXMLElement 
*/ 
function ConvertToXml($record){ 
    // Objects need to be arrays 
    if(is_object($record)){ 
     $record = get_object_vars($record); 
    } 

    // We need an array argument 
    if(!is_array($record)){ 
     trigger_error('$record must be an object or an array.', E_USER_WARNING); 
     return null; 
    } 

    // Now we build XML 
    ob_start(); 
    echo '<xml>', PHP_EOL; 
    foreach($record as $name => $value){ 
     if(is_object($value) or is_array($value) or is_resource($value)){ 
      trigger_error('$record must have only scalar values.', E_USER_WARNING); 
      return null; 
     } 
     if(!is_string($name) or !preg_match('~[a-z_][a-z0-9]*~i', $name)){ 
      trigger_error('$record must have only XML-tag friendly string keys.', E_USER_WARNING); 
      return null; 
     } 

     // NULL produces an empty node 
     if(is_null($value)){ 
      echo "<{$name} />", PHP_EOL; 
      continue; 
     } 

     // Numerics don't need to be XML encoded 
     if(is_integer($value) or is_float($value) or is_bool($value)){ 
      echo "<{$name}>{$value}</{$name}>", PHP_EOL; 
      continue; 
     } 

     // We must have a string now 
     if(!is_string($name)){ 
      trigger_error('$record must have only scalar values.', E_USER_WARNING); 
      return null; 
     } 

     // Do we have an XML field? 
     if(preg_match('~^\s*<.+>\s*$~s', $value)){ 
      // Test it for real! 
      if($xml = @simplexml_load_string("<xml>{$value}</xml>")){ 
       echo $value, PHP_EOL; 
       continue; 
      } 
     } 

     // Now output random strings 
     echo "<{$name}>", htmlentities($value, ENT_QUOTES, 'utf-8'), "</{$name}>", PHP_EOL; 
    } 
    echo '</xml>', PHP_EOL; 

    // Store built XML 
    $xml = ob_get_clean(); 

    // Load the built XML 
    return @simplexml_load_string($xml);; 
} 

// Prepare an array 
$record = array(); 
$record['ID'] = 1; 
$record['Name'] = 'SomeName'; 
$record['Data'] = '<data><foo>one</foo><bar>two</bar></data>'; 
if($xml = ConvertToXml($record)){ 
    echo $xml->asXML(); 
} 

^Una respuesta para la posteridad.