2009-07-06 16 views
1

入力としてSQLを指定すると、PostgreSQLデータベースにクエリを実行し、結果をXMLとして返す必要があります。私は次のコードでこれを行いました:PHP DOMを使用したPostgreSQLクエリーの結果の変換DOM

<?php 

$link = "host=localhost dbname=company user=pgsql password=password"; 
$connect = pg_connect($link); 

$query = "SELECT * FROM customer"; 
$result = pg_query($connect, $query); 

$doc = new DomDocument("1.0"); 

$root = $doc->createElement('data'); 
$root = $doc->appendChild($root); 

while($row = pg_fetch_assoc($result)){ 
    $node = $doc->createElement('collection'); 
    $node = $root->appendChild($node); 

    foreach($row as $fieldname => $fieldvalue){ 
     $node->appendChild($doc->createElement($fieldname, $fieldvalue)); 
    } 
} 

$doc->save("cust.xml"); 

?> 

最終的に、私はCSS文書を直接XML文書に適用します。それぞれのコレクションノードのスタイル情報を指定します。しかし、コレクションのサブコレクション、サブコレクションなどが存在する可能性もあります。

(SO:マスター、詳細、サブディテール、サブサブディテールなど)

問題は、私のコードは唯一のマスター、詳細、サブ細部のためのXMLを生成しますです。生成されたXMLがすべてのレベルのデータを常に「取得」するように、コードを変更するにはどうすればよいですか?

おかげで...


はい、私は、階層関係に言及しています。たとえば、私の現在のコードでは、 "Customer"テーブルのフィールドのすべての属性を見ることができます。ただし、顧客属性の1つが「住所」で、顧客が複数の住所を持っていた場合はどうなりますか?これは...私はアドレスは、属性が、サブ属性を持っているという事実を「拾う」ために私のコードを変更しようとしている

<data> 
    <collection> 
    <fname>Joe</fname> 
    <lname>Smith</lname> 
    <address> 
     <address A> 123...</address A> 
     <address B> 234...</address B> 
    </collection> 
</data> 

...として表示されるように

答えて

3

が必要になりますまず、利用可能な組み込みのfunctionsを使用して、Postgres自体でxmlマッピングを実行することを検討することができます。これの2つの利点は、データ抽象化機能が共存していることと、PostgresがPHPよりも効率的にこのタスクを実行するためにはるかに最適化されていることです。 xmlのより高いレベルの変更を行う必要がある場合、xsltはそのトリックを行う必要があります。

あなたが言及している問題については、階層関係を持つテーブルのデータを参照しているかどうかはわかりません。

関連する問題