Как сделать замену и запись в существующем xml файле?

nikoyar

Новичок
Имеем выгрузку из 1с в формате commerceml (xml). По факту характеристики у товаров заполнялись "абы как" и пробил час, когда они стали необходимы, но возможности как следует их записать уже нет.
Есть только вариант прописать их построчно в элемент <Описание>.
например
Диаметр=100мм
Длина=120мм

Таким образом получаем в выгрузке
HTML:
<Товар>
    <Ид>001bfc8d17d7</Ид>
    <Наименование>Название товара</Наименование>
    <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="">шт</БазоваяЕдиница>
    <ЗначенияРеквизитов>
        <ЗначениеРеквизита>
            <Наименование>ВидНоменклатуры</Наименование>
            <Значение>Товар</Значение>
        </ЗначениеРеквизита>
        <ЗначениеРеквизита>
            <Наименование>ТипНоменклатуры</Наименование>
            <Значение>Товар</Значение>
        </ЗначениеРеквизита>
        <ЗначениеРеквизита>
            <Наименование>Полное наименование</Наименование>
            <Значение>Здесь полное название товара</Значение>
        </ЗначениеРеквизита>
    </ЗначенияРеквизитов>
    <СтавкиНалогов>
        <СтавкаНалога>
            <Наименование>НДС</Наименование>
            <Ставка>18</Ставка>
        </СтавкаНалога>
    </СтавкиНалогов>
    <Группы>
        <Ид>001bfc8d17d7</Ид>
    </Группы>
    <Описание>Диаметр=100мм
Длина=120мм
    </Описание>
</Товар>
Требуется каждую характеристику (Диаметр,Длина) записать в этот же файл должным образом, а значение элемента <Описание> удалить (или вообще удалить весь этот элемент), то есть чтобы получилось так
HTML:
<Товар>
    <Ид>001bfc8d17d7</Ид>
    <Наименование>Название товара</Наименование>
    <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="">шт</БазоваяЕдиница>
    <ЗначенияРеквизитов>
        <ЗначениеРеквизита>
            <Наименование>ВидНоменклатуры</Наименование>
            <Значение>Товар</Значение>
        </ЗначениеРеквизита>
        <ЗначениеРеквизита>
            <Наименование>ТипНоменклатуры</Наименование>
            <Значение>Товар</Значение>
        </ЗначениеРеквизита>
        <ЗначениеРеквизита>
            <Наименование>Полное наименование</Наименование>
            <Значение>Здесь полное название товара</Значение>
        </ЗначениеРеквизита>
    </ЗначенияРеквизитов>
    <СтавкиНалогов>
        <СтавкаНалога>
            <Наименование>НДС</Наименование>
            <Ставка>18</Ставка>
        </СтавкаНалога>
    </СтавкиНалогов>
    <Группы>
        <Ид>001bfc8d17d7</Ид>
    </Группы>
    <ХарактеристикиТовара>
        <ХарактеристикаТовара>
            <Наименование>Диаметр</Наименование>
            <Значение>100мм</Значение>
        </ХарактеристикаТовара>
        <ХарактеристикаТовара>
            <Наименование>Длина</Наименование>
            <Значение>120мм</Значение>
        </ХарактеристикаТовара>       
    </ХарактеристикиТовара>
</Товар>
Я смог только выдернуть характеристики из элемента <Описание> и придать им нужный вид вот этим кодом
PHP:
$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;
            }
      }
}
Но как теперь записать это в файл, точнее заменить Описание на ХарактеристикиТовара - никак не пойму ... может кто подскажет?
 

nikoyar

Новичок
сделал так .. не знаю уж насколько это великий костыль, но все работает как надо.
PHP:
$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));
 

nikoyar

Новичок
ну, наверное, да :)
есть какие то глобальные минусы моего решения?
 
Сверху