Как произвести запись в xml файл?

Имеем выгрузку из 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));
  • Вопрос задан
  • 3121 просмотр
Решения вопроса 1
nikoyar
@nikoyar Автор вопроса
Я дополню свой вопрос.
С помощью чего это можно сделать я представляю, но навалился какой то жуткий тупняк, что не могу понять, например, как мне сделать замену именно в текущем элементе Описание.
То есть можно, конечно, взять simplexmlelement.addchild
но тут я упираюсь в то, что не пойму как указать создаваемому потомку в какого именно родителя ему нужно попасть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
akarin
@akarin
Попробуйте SimpleXML.
php.net/manual/ru/simplexmlelement.addchild.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы