Тема: Проблеми зі створенням XML
Існує функція яка викликається декілька разів і якій передаються два параметри. Функція, використовуючи ці параметри, має сформувати XML файл. Проблема полягає в тому як приєднати дані до DOM так щоб вони не дублювалися і коли дані для функції закінчаться записати XML в файл. Ось код:
$pubsFile = new DOMDocument("1.0", "UTF-8"); // об_єкт оголошено саме тут (і функція використовують
// його як глобальний) для того щоб не створювати його наново при кожному виклику функції
$pubsFile->formatOutput = true;
$tmpPubsFile = '';
function parseRSS($rss) {
global $pubsFile, $tmpPubsFile;
foreach ($rss->channel->item as $e) {
if ( stripos((string)$e->title[0], 'новые') !== false ) {
writeRssData($e->pubDate, $e->description);
}
}
$pubsFile = new DOMDocument();
$pubsFile->loadXML($tmpPubsFile);
$pubsFile->save(PUBS_FILE_NAME);
}
function writeRssData($pubDate, $description){
global $pubsFile, $data, $pubsFileYears, $tmpPubsFile;
$day = date('d', strtotime($pubDate));
$month = date('F', strtotime($pubDate));
$year = date('Y', strtotime($pubDate));
if (isset($pubsFile->data)) {
# open & read
echo 'file';
} else {
if ($pubsFile->getElementById($pubDate) === NULL) {
$data = $pubsFile->getElementsByTagName('data')->item(0);
if (!$data) { // всі ці if'и потрібні для того щоб, якщо елемент існує, то не створювати його заново
$data = $pubsFile->createElement("data");
}
$pubsFile->appendChild($data);
$pubsFileYears = $pubsFile->getElementsByTagName('years')->item(0);
if (!$pubsFileYears){
$pubsFileYears = $pubsFile->createElement('years');
$pubsFileYearsId = $pubsFile->createAttribute('id');
$pubsFileYearsId->value = 'years';
$pubsFileYears->value = $pubsFileYearsId;
}
$data->appendChild($pubsFileYears);
$pubsFileYear = $pubsFile->getElementById($year);
if (!$pubsFileYear) {
$pubsFileYear = $pubsFile->createElement('year');
$pubsFileYearId = $pubsFile->createAttribute('id');
$pubsFileYearId->value = $year;
$pubsFileYear->appendChild($pubsFileYearId);
}
$pubsFileYears->appendChild($pubsFileYear);
$pubsFileMonth = $pubsFile->getElementById(date('m', strtotime($pubDate)).'.'.$year);
if ($pubsFileMonth === NULL) {
$pubsFileMonth = $pubsFile->createElement('month');
$pubsFileMonthId = $pubsFile->createAttribute('id');
$pubsFileMonthId->value = date('m', strtotime($pubDate)).'.'.$year;
$pubsFileMonth->appendChild($pubsFileMonthId);
}
$pubsFileYear->appendChild($pubsFileMonth);
$pubsFileDay = $pubsFile->createElement('day');
$pubsFileDayId = $pubsFile->createAttribute('id');
$pubsFileDayId->value = $day.'.'.date('m', strtotime($pubDate)).'.'.$year;
$pubsFileDay->appendChild($pubsFileDayId);
$pubsFileDescription = $pubsFile->createTextNode($description);
$pubsFileDay->appendChild($pubsFileDescription);
$pubsFileMonth->appendChild($pubsFileDay);
$data->appendChild($pubsFileYears);
$tmpPubsFile = $data->ownerDocument->saveXML(); // змінна $tmpPubsFile тут типу для накопичення
// даних щоб їх потім можна було записати. Вона глобальна і отже, не створюється кожного разу коли
// викликається функція. Але, як видно нічого не накопичується.
// тут у мене була ідея тупо кожного разу перезаписувати глобальну змінну новим XML об_єктом,
// але вилазить помилка Uncaught exception 'DOMException' with message 'Wrong Document Error.
// При спробі імпортувати DOM щось їще вилазить. Зараз не можу перевірити.
/*$pubsFile = new DOMDocument("1.0", "UTF-8");
$tmpPubsFile = $pubsFile->importNode($data, TRUE);
$pubsFile->appendChild($tmpPubsFile);*/
#$pubsFile->loadXML($tmpPubsFile);
Мав би, в результаті роботи програми, виникнути отака структура:
<data>
<years>
<year id="2013">
<month id="10.2013">
<day id="23.10.2013">Text here</day>
<day id="22.10.2013">Text here</day>
</month>
<month id="10.2013">
<day id="23.10.2013">Text here</day>
<day id="22.10.2013">Text here</day>
</month>
</year>
</years>
</data>
але виходить отаке:
<data>
<years>
<year id="2013">
<month id="10.2013">
<day id="23.10.2013">Text here</day>
</month>
</year>
<year id="2013">
<month id="10.2013">
<day id="22.10.2013">Text here</day>
</month>
</year>
</years>
</data>