从两个函数php创建一个xml节点

时间:2013-05-19 15:16:50

标签: php xml

我使用带有数据库连接的google map api,我有一个输出xml文件的函数,JavaScript读取坐标。没问题。

现在我想添加另一个函数,用于打印出已在db中保存坐标的用户。

但我的xml文件打印出来就像这样。

<blog title="Ipsum" text="IpsumLorem" lat="31.968599" lng="-99.901810"/>
<blog username="user1"/>

而不是像第一行那样打印第一行中的user1

<blog title="Ipsum" text="IpsumLorem" lat="31.968599" lng="-99.901810" username="user1" />

这是我的两个功能

function fetch_articles() {
    $query = $this->link->query("SELECT * FROM blog ");  
    $query->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $query->fetch()) {  
        $node = $dom->createElement("blog");  
    $newnode = $parnode->appendChild($node);   
    $newnode->setAttribute("title",$row['title']);
    $newnode->setAttribute("text", $row['text']);  
    $newnode->setAttribute("lat", $row['lat']);  
    $newnode->setAttribute("lng", $row['lng']);  
    } 
}

function fetch_users() {
    $query = $this->link->query("SELECT * FROM user ");  
    $query->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $query->fetch()) {  
        $node = $dom->createElement("blog");  
    $newnode = $parnode->appendChild($node);   
    $newnode->setAttribute("username",$row['username']);
    } 
}



 $area = new Areas();
$area_info = $area->fetch_articles(); 
$user_info = $area->fetch_users(); 
echo $dom->saveXML();

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您需要在同一DOMElement上应用属性更改。因为这两种方法实际上包含完全相同的代码,所以也值得封装它:

$blog = $dom->createElement("blog");

$apply = new DomAttributeApplyIterator(
    new PdoQueryIterator($pdo, "SELECT * FROM blog"), $blog
);
$apply->apply();

$apply = new DomAttributeApplyIterator(
    new PdoQueryIterator($pdo, "SELECT * FROM user"), $blog
);
$apply->apply();

echo $dom->saveXML();

使用了两种新类型:

class DomAttributeApplyIterator extends IteratorIterator
{
    /**
     * @var DOMElement
     */
    private $element;

    public function __construct(Traversable $iterator, DOMElement $element) {
        parent::__construct($iterator);
        $this->element = $element;
    }

    public function apply() {
        foreach($this as $key => $value) {
            $this->element->setAttribute($key, $value);
        }
    }
}

class PdoQueryIterator implements IteratorAggregate
{
    private $pdo, $query;

    public function __construct(PDO $pdo, $query) {
        $this->pdo = $pdo;
        $this->query = $query;
    }

    public function getIterator() {
        $stmt = $this->pdo->query($this->query);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        return $stmt;
    }
}

答案 1 :(得分:1)

您所拥有的代码缺乏将用户与博文相关联的方法。因此,编写一个在单个结果中获取两者的查询可能最容易,然后将其添加到DOM节点。它可以像这样工作:

function fetch_articles_with_username() {
    $query = $this->link->query("SELECT * FROM blog LEFT JOIN user WHERE blog.userid = user.id ");  
    $query->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $query->fetch()) {  
        $node = $dom->createElement("blog");  
        $newnode = $parnode->appendChild($node);   
        $newnode->setAttribute("title",$row['title']);
        $newnode->setAttribute("text", $row['text']);  
        $newnode->setAttribute("lat", $row['lat']);  
        $newnode->setAttribute("lng", $row['lng']);  
        $newnode->setAttribute("username",$row['username']);
    } 
}

您可以像上面一样使用它,只需拨打fetch_articles_with_username()一次。