使用PHP DOM将PostgreSQL查询的结果转换为XML

时间:2009-07-06 14:59:05

标签: php xml postgresql dom

将SQL作为输入,我必须查询PostgreSQL数据库并将结果作为XML返回。我用以下代码完成了这个:

<?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文档。我将为每个“集合”节点指定样式信息。但是,可能会有集合的子集合,甚至子集合等等。

(所以:主人,细节,子细节,子细节等)

问题是,我的代码只会为Master,detail,sub-detail生成XML。如何修改我的代码,以便生成的XML始终“捕获”所有级别的数据?

...谢谢


是的,我指的是等级关系。例如,使用我当前的代码,我可以看到“Customer”表的所有字段属性。但是,如果其中一个客户属性是“地址”,并且客户有多个地址,该怎么办?这需要显示为......

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

我正在尝试修改我的代码以“接收”地址,尽管属性具有子属性......

1 个答案:

答案 0 :(得分:3)

首先,您可以考虑使用可用的内置functions在Postgres中执行xml映射。这样做的两个好处是你的数据抽象功能保持在一起,并且Postgres比php更有效地执行这项任务。如果你必须对xml进行更高级别的修改,那么xslt应该可以解决这个问题。

至于你提到的问题,我不确定你是否指的是表中具有层次关系的数据?