2013-09-16 3 views
0

Я пытаюсь создать XML-фид, в основном из списка вакансий. Сейчас у меня 39 списков вакансий в базе данных, и я создаю XML с помощью SimpleXML, и он работает отлично, за исключением того, что он выводит самую последнюю запись из базы данных в xml. Я уверен, что есть простое решение.Сгенерировать XML из динамического PHP с помощью цикла foreach

Ознакомившись с кодом, я хочу, чтобы каждое задание находилось внутри элемента <job>, и я хочу создать новый элемент <job> для каждого задания. Все они заключены внутри одного элемента <source>. Вот мой PHP код, и ниже, что является результатом я получаю - вы увидите, что есть только одна строка возвращение вместо всех 39.

<?php 
Header('Content-type: text/xml'); 
class SimpleXMLExtended extends SimpleXMLElement { 
    public function addCData($cdata_text) { 
    $node = dom_import_simplexml($this); 
    $no = $node->ownerDocument; 
    $node->appendChild($no->createCDATASection($cdata_text)); 
    } 
} 


$jobs = $dbjobs->find(array('job_title' => array('$exists' => true), 'job_title' => array('$nin'=> array('',' ', null)))); 
$jobs = iterator_to_array($jobs); 
$xml = new SimpleXMLExtended('<source/>'); 
$i = 0; 
foreach ($jobs as $job) { 
    $i++; 
    $xml->job = NULL; 
    $j = $xml->job; 
    $j->referencenumber = NULL; 
    $j->referencenumber->addCData($job['id']); 
    $j->title = NULL; 
    $j->title->addCData($job['job_title']); 
    $j->url = NULL; 
    $j->url->addCData('http://www.site.com/joblisting.php?jl=' . $job['id']); 
    $j->description = NULL; 
    $j->description->addCData($job['job_description']); 
    $j->company = NULL; 
    $j->company->addCData($job['company']); 
    $j->city = NULL; 
    $j->city->addCData($job['city']); 
    $j->state = NULL; 
    $j->state->addCData($job['state']); 
    $j->postalcode = NULL; 
    $j->postalcode->addCData(''); 
    $j->country = NULL; 
    $j->country->addCData('US'); 
    $j->date = NULL; 
    $j->date->addCData(date("Y-m-d", $job['added']->sec)); 
    $j->site = NULL; 
    $j->site->addCData('site.com'); 
    $j->count = NULL; 
    $j->count->addCData($i); 
} 

print($xml->asXML()); 
?> 

А вот пример ответа я получаю:

<source> 
    <job> 
    <referencenumber>230257</referencenumber> 
    <title>Home Phone Representative</title> 
    <url>http://www.site.com/joblisting.php?jl=230257</url> 
    <description></description> 
    <company>Media LLC</company> 
    <city>San Jose</city> 
    <state>CA</state> 
    <postalcode></postalcode> 
    <country>US</country> 
    <date>2013-09-16</date> 
    <site>site.com</site> 
    <count>39</count> 
    </job> 
</source> 

Как вы можете видеть, он заполняется просто отлично, но мне нужны все списки, а не только последний в цикле. Заранее благодарны за Вашу помощь.

ответ

0

Вы должны добавить Чайлдс к корню:

foreach ($jobs as $job) { 
    $i++; 
    $j=$xml->addChild('job') 
    ... 
+0

my bad: mickro is right: это addChild ('job'), а не ('source'). – Johanness

0
$xml->job = NULL; 

ваша вонг линия, потому что вы отменяете последнюю запись.

и все $j->xxxxxx = NULL; бесполезны.

затем код, как

foreach ($jobs as $job) { 
    $i++; 
    $j = $xml->addChild('job'); 
    $j->referencenumber->addCData($job['id']); 
    $j->title->addCData($job['job_title']); 

(...) 

лучше.

, чтобы узнать больше о проверке SimpleXMLElement::addChild Док.

Смежные вопросы