2010-12-16 121 views
5

我有一個看起來像這樣的數據庫行。如何使用SimpleXML在PHP中合併兩個XML文檔?

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

我需要按照以下方式將此數據格式化爲XML。

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

我目前使用SimpleXML來試圖建立這一點,但我不知道如何去插入現有的XML爲我試圖建立新的XML文檔。

如果PHP中還有其他標準XML構建器,我也願意使用它們。字符串連接不是可接受的答案。

編輯:它看起來好像SimpleXML不會做我需要的。我想在這一點上,我需要其他XML解析器的建議。

+1

請包括您的**現有XML格式的示例** – ajreal 2010-12-16 19:15:08

+1

可能的重複[SimpleXML:追加一棵樹到另一個](http://stackoverflow.com/questions/3418019/simplexml-append-one-tree-到另一個) – salathe 2010-12-16 20:25:08

回答

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

經過測試,它的工作原理。將它轉換爲實際的應用程序應該是微不足道的。可能有更靈活的方式,但我不知道。他們不稱之爲SimpleXML,無所爲:)

+2

不行了。數據庫中的XML具有複雜的結構。我需要一個通用的方式來做到這一點。將數據庫中的XML考慮爲任意結構化的XML。 – haydenmuhl 2010-12-16 18:59:21

+1

然後SimpleXML不會爲你剪下它。你需要PHP DOM。 – Jonah 2010-12-16 19:43:47

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> 

測試此代碼,它也可以。 您將不得不像上面的答案一樣創建兩個SimpleXml對象。除此之外,您可以添加 其他元素,例如添加班級變量。 A <?xml version="1.0"?>將被添加到最終的xml字符串/文件中。不知道你是否需要<?xml version="1.0"?>。 如果沒有,你可以把它拿出來用:

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

您可以獲取更多信息請查看http://www.php.net/manual/en/simplexmlelement.asxml.php上再節能的SimpleXML對象回XML字符串/文件。

+1

也是不行。見約拿布朗迴應的評論。 – haydenmuhl 2010-12-16 18:59:48

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(); 
} 

^後代的答案。