Имеем выгрузку из 1с в формате commerceml (xml). По факту характеристики у товаров заполнялись "абы как" и пробил час, когда они стали необходимы, но возможности как следует их записать уже нет.
Есть только вариант прописать их построчно в элемент <Описание>.
например
Диаметр=100мм
Длина=120мм
Таким образом получаем в выгрузке
<Товар>
<Ид>001bfc8d17d7</Ид>
<Наименование>Название товара</Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="">шт</БазоваяЕдиница>
<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>Полное наименование</Наименование>
<Значение>Здесь полное название товара</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
<СтавкиНалогов>
<СтавкаНалога>
<Наименование>НДС</Наименование>
<Ставка>18</Ставка>
</СтавкаНалога>
</СтавкиНалогов>
<Группы>
<Ид>001bfc8d17d7</Ид>
</Группы>
<Описание>Диаметр=100мм
Длина=120мм
</Описание>
</Товар>
Требуется каждую характеристику (Диаметр,Длина) записать в этот же файл должным образом, а значение элемента <Описание> удалить (или вообще удалить весь этот элемент), то есть чтобы получилось так
<Товар>
<Ид>001bfc8d17d7</Ид>
<Наименование>Название товара</Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="">шт</БазоваяЕдиница>
<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>Полное наименование</Наименование>
<Значение>Здесь полное название товара</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
<СтавкиНалогов>
<СтавкаНалога>
<Наименование>НДС</Наименование>
<Ставка>18</Ставка>
</СтавкаНалога>
</СтавкиНалогов>
<Группы>
<Ид>001bfc8d17d7</Ид>
</Группы>
<ХарактеристикиТовара>
<ХарактеристикаТовара>
<Наименование>Диаметр</Наименование>
<Значение>100мм</Значение>
</ХарактеристикаТовара>
<ХарактеристикаТовара>
<Наименование>Длина</Наименование>
<Значение>120мм</Значение>
</ХарактеристикаТовара>
</ХарактеристикиТовара>
</Товар>
Я смог только выдернуть характеристики из элемента <Описание> и придать им нужный вид вот этим кодом
$reader = new XMLReader();
$reader->open($file);
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if ($reader->localName == "Описание") {
$reader->read();
$rparams = explode("\n", $reader->value);
$newitem = "<ХарактеристикиТовара>\n";
foreach ($rparams as $rparam) {
$pieces = explode("=", $rparam);
$newitem .= "<ХарактеристикаТовара>\n";
$newitem .= "<Наименование>".$pieces[0]."</Наименование>\n";
$newitem .= "<Значение>".$pieces[1]."</Значение>\n";
$newitem .= "</ХарактеристикаТовара>\n";
}
$newitem .= "</ХарактеристикиТовара>\n";
echo $newitem;
}
}
}
Но как теперь записать это в файл, точнее заменить Описание на ХарактеристикиТовара - никак не пойму ... может кто подскажет?
Сделал так:
$file ='import.xml';
$reader = new XMLReader();
$reader->open($file);
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if ($reader->localName == "Описание") {
$reader->read();
$rparams = explode("\n", $reader->value);
$newitem = "<ХарактеристикиТовара>\n";
foreach ($rparams as $rparam) {
$pieces = explode("=", $rparam);
$newitem .= "<ХарактеристикаТовара>\n";
$newitem .= "<Наименование>".$pieces[0]."</Наименование>\n";
$newitem .= "<Значение>".$pieces[1]."</Значение>\n";
$newitem .= "</ХарактеристикаТовара>\n";
}
$newitem .= "</ХарактеристикиТовара>\n";
$newitems[] = $newitem;
}
}
}
$fn = file_get_contents($file);
preg_match_all('~<Описание>(.*?)</Описание>~s', $fn, $matches);
file_put_contents($file,str_replace ($matches[0], $newitems, $fn));