2010-12-16 4 views
5

私はこのようなデータベース行を持っています。SimpleXMLを使用してPHPで2つの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

+1

可能重複[SimpleXMLは:別に一本の木を追加](http://stackoverflow.com/questions/3418019/simplexml-append-one-tree- to-another) – salathe

答えて

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

+1

それから、SimpleXMLはあなたのためにカットしません。 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> 

このコードをテストしても動作します。 上記のような2つのSimpleXmlオブジェクトを作成する必要があります。それ以外の場合は、クラスの追加などの追加要素を 追加するだけです。 <?xml version="1.0"?>が最後のXML文字列/ファイルに追加されます。

<?xml version="1.0"?>が必要かどうかわかりません。 あなたとそれを取ることができない場合は、次の

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

あなたは再保存のSimpleXMLは、XML文字列/ファイルに戻ってオブジェクトに関する詳しい情報は、http://www.php.net/manual/en/simplexmlelement.asxml.phpをチェックアウトすることができます。

+1

また行きません。ジョナ・ブロンの反応に対するコメントを参照してください。 – 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(); 
} 

^後の回答。

関連する問題