Помогите отредактировать XML средствами PHP

12
tiset
На сайте с 17.04.2011
Offline
45
763

description в товарном фиде оффера имеет вид:


<description><![CDATA[Складной нож


]]></description>
(#)]

В итоге не грузится (только description)

Как его привести в человеческий вид с помощью PHP?

Если можно с примерами, в скриптах не силен.

S3
На сайте с 29.03.2012
Online
367
#1

небось в блокноте плюс-плюс правили?)))

код вставляйте тэгом CODE (#) а не php - будет понятнее

tiset
На сайте с 17.04.2011
Offline
45
#2

Спасибо исправил, а по вопросу то что?

S3
На сайте с 29.03.2012
Online
367
#3

tiset, мда, уж исправили так исправили)))

в панели размещения сообщения вверху есть тэг CODE, обозначен знаком 'диез', а не точто вы написали.

По вашему вопросу я предположил что вы правили в нотепад++, он добавил свои спецсимволы а хмл этого не любит. Правьте в нормальной IDE или консольном редакторе если в линухе

ДП
На сайте с 23.11.2009
Offline
203
#4
tiset:
description в товарном фиде оффера имеет вид:

<description><![CDATA[Складной нож


]]></description>


В итоге не грузится (только description)
Как его привести в человеческий вид с помощью PHP?
Если можно с примерами, в скриптах не силен.

Не грузится куда? Каким кодом грузите?

tiset
На сайте с 17.04.2011
Offline
45
#5

Там исходный xml такой ломанный. Грузится плагином гдеслоншоп.

Так как выгрузки большие, состряпал нечто похожее на скрипт по разбивке большого .xml.zip на несколько маленьких и хочу в этом же скрипте замутить исправление корявого дескрипшина.


<?php
if(!empty($_POST['name'])){
$name = trim(strip_tags($_POST['name']));
}

$filen=file_get_contents("$name");
if (!function_exists("file_put_contents"))
{
function file_put_contents($filename, $data, $file_append = false)
{
$fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
if(!$fp) {
trigger_error('file_put_contents cannot write in file.', E_USER_ERROR);
return;
}
$result = fputs($fp, $data);
fclose($fp);
return $result;
}
}
file_put_contents("1.zip", $filen);
$zip = new ZipArchive;
if ($zip->open('1.zip') === TRUE) {
// путь к каталогу, в который будут помещены файлы
$zip->extractTo('zip');
if ($zip->open('1.zip') == TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
echo $filename.'<br>';
}
}
echo 'yes';
$zip->close();
} else {
echo 'no';
}
$x_limit = 230000; // нужный размер в байтах (символ ASCII - 1 байт)
set_time_limit(90); $t_start = microtime(1);
$path_ulr2='XXXX';
$path_ulr='XXXXX';
$str_xml=file_get_contents($path_ulr.$filename);
if (preg_match('|<\?xml[^>]*?\?>(.*?)<offer[^>]*?>|sei', $str_xml, $arr)) $hider = $arr[1];
else $hider='';
$x_res=NULL;
$x_r=array('/<\?xml[^>]*?\?>/i','/<offers>/i','/<\/offers>/i');
$str_xml=preg_replace($x_r,'',stristr($str_xml,'<url>')); // удаляем header и footer
$im_or="original_picture"; $im_pi="picture";
$str_xml=str_replace($im_or,$im_pi,stristr($str_xml,'<url>'));
$str_xml=str_replace('<thumbnail>','<!--<thumbnail>',stristr($str_xml,'<url>'));
$str_xml=str_replace('</thumbnail>','</thumbnail>-->',stristr($str_xml,'<url>'));
//удаление description
if(isset($_POST['terms']) && $_POST['terms'] == 1) {
$str_xml=preg_replace('/<description>(.*?)<\/description>/is','<description><![CDATA[]]></description>',stristr($str_xml,'<url>'));
}
preg_match_all("/<offer[^>]*?>.{1,10000}<\/offer>/is", $str_xml, $x_res);
echo 'max used memory '.number_format((memory_get_usage()-$m_start)/(1024*1024))." Mb<br />\n"; $str_xml=NULL;
$x_join = $x_limit/10000; // укрупнение массива
foreach ($x_res[0] as $value): $i++; $value1 .= $value;
if(!($i%$x_join)) { $x_arr[]=$value1; unset($value1); }
endforeach; $x_arr[]=$value1;
$x_res=NULL;
// header и footer
$x_s='<?xml version="1.0" encoding="UTF-8"?>'
.$hider.
'<offers>';
$x_e='</offers>
</shop>
</yml_catalog>';
// форматирование и запись
$i=1; foreach ($x_arr as $value): $value = $x_s."\n".$value."\n".$x_e;
$z=$i;
file_put_contents('gdeslon_'.$i++.'.xml',$value);
$zip = new ZipArchive;
if ($zip->open('gdeslon_'. $z .'.zip', ZipArchive::CREATE) === true){
$zip->addFile('gdeslon_'. $z .'.xml');
echo $path_ulr2.'gdeslon_'. $z .'.zip<br>';
$zip->close();
}
else{
echo 'no';
}
endforeach;
if($value) echo 'file split - ok - used time - '.round((microtime(1)-$t_start),4).' sec';
?>
K0
На сайте с 01.09.2016
Offline
72
#6

Не знаю как вы этот скрипт вызываете, но есть в нем вот такой фрагмент который заменяет description на пустой:

//удаление description

if(isset($_POST['terms']) && $_POST['terms'] == 1) {
$str_xml=preg_replace('/<description>(.*?)<\/description>/is','<description><![CDATA[]]></description>',stristr($str_xml,'<url>'));
}
Не в нем дело?
tiset
На сайте с 17.04.2011
Offline
45
#7

Вызываю из админки, специально поставил кнопку для подобных фидов. Так что дело не в этом.

ДП
На сайте с 23.11.2009
Offline
203
#8
tiset:
Там исходный xml такой ломанный. Грузится плагином гдеслоншоп.
Так как выгрузки большие, состряпал нечто похожее на скрипт по разбивке большого .xml.zip на несколько маленьких и хочу в этом же скрипте замутить исправление корявого дескрипшина.

Вот плагин и надо смотреть. xml как раз не корявый, а правильный, раз в cdata описание запихали, а вот плагин импорта, походу, не умеет с ним работать.

tiset
На сайте с 17.04.2011
Offline
45
#9

Другие фиды он нормально грузит, там дескрип в одну строку, а копаться в плагине - знаний нэту.

В любом случае спасибо за ответ)

ДП
На сайте с 23.11.2009
Offline
203
#10

Хм, скрипт разбития файлов-то как-то же составили. Парсить xml не сложнее.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий