N
N
nikoyar2014-08-29 22:14:06
Programming
nikoyar, 2014-08-29 22:14:06

How to write to xml file?

We have an unloading from 1s in the commerceml (xml) format. In fact, the characteristics of the goods were filled in "anyhow" and the hour has struck when they became necessary, but there is no longer an opportunity to write them down properly.
There is only an option to write them line by line in the <Description> element.
e.g.
Diameter=100mm
Length=

120mm

<Товар>
  <Ид>001bfc8d17d7</Ид>
  <Наименование>Название товара</Наименование>
  <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="">шт</БазоваяЕдиница>
  <ЗначенияРеквизитов>
    <ЗначениеРеквизита>
      <Наименование>ВидНоменклатуры</Наименование>
      <Значение>Товар</Значение>
    </ЗначениеРеквизита>
    <ЗначениеРеквизита>
      <Наименование>ТипНоменклатуры</Наименование>
      <Значение>Товар</Значение>
    </ЗначениеРеквизита>
    <ЗначениеРеквизита>
      <Наименование>Полное наименование</Наименование>
      <Значение>Здесь полное название товара</Значение>
    </ЗначениеРеквизита>
  </ЗначенияРеквизитов>
  <СтавкиНалогов>
    <СтавкаНалога>
      <Наименование>НДС</Наименование>
      <Ставка>18</Ставка>
    </СтавкаНалога>
  </СтавкиНалогов>
  <Группы>
    <Ид>001bfc8d17d7</Ид>
  </Группы>
  <Описание>Диаметр=100мм
Длина=120мм
  </Описание>
</Товар>

It is required to write each characteristic (Diameter, Length) to the same file properly, and delete the value of the <Description> element (or even delete this entire element), that is, to get it like this
<Товар>
  <Ид>001bfc8d17d7</Ид>
  <Наименование>Название товара</Наименование>
  <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="">шт</БазоваяЕдиница>
  <ЗначенияРеквизитов>
    <ЗначениеРеквизита>
      <Наименование>ВидНоменклатуры</Наименование>
      <Значение>Товар</Значение>
    </ЗначениеРеквизита>
    <ЗначениеРеквизита>
      <Наименование>ТипНоменклатуры</Наименование>
      <Значение>Товар</Значение>
    </ЗначениеРеквизита>
    <ЗначениеРеквизита>
      <Наименование>Полное наименование</Наименование>
      <Значение>Здесь полное название товара</Значение>
    </ЗначениеРеквизита>
  </ЗначенияРеквизитов>
  <СтавкиНалогов>
    <СтавкаНалога>
      <Наименование>НДС</Наименование>
      <Ставка>18</Ставка>
    </СтавкаНалога>
  </СтавкиНалогов>
  <Группы>
    <Ид>001bfc8d17d7</Ид>
  </Группы>
  <ХарактеристикиТовара>
    <ХарактеристикаТовара>
      <Наименование>Диаметр</Наименование>
      <Значение>100мм</Значение>
    </ХарактеристикаТовара>
    <ХарактеристикаТовара>
      <Наименование>Длина</Наименование>
      <Значение>120мм</Значение>
    </ХарактеристикаТовара>		
  </ХарактеристикиТовара>
</Товар>

I could only pull out the characteristics from the <Description> element and give them the desired look with this code
$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;
      }
   	}
}

But now how to write it to a file, or rather replace the Description with the Characteristics of the Goods - I just don’t understand ... can someone tell me?
Did it like this:
$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));

Answer the question

In order to leave comments, you need to log in

4 answer(s)
S
sir_Maverick, 2016-07-25
@sir_Maverick

sum = sum / (n / 2);
You have sum an integer, as a result of division it can turn out to be a fraction, perhaps this is the problem.
UPD:

for(int j=0;j<n-1;j++)
    {
        for(int k=j+1;k<n;j++)
        {
            
            if (((int)(mas[j]) + mas[k]) == sum)
                Console.WriteLine((j+1)+" "+(k+1));
        }
    }

Your inner for loop runs in a circle and increments j until it exceeds 200, since it checks for k in the loop exit condition, but only the j variable is incremented. Replace for(int k=j+1;k<n;j++)
with for(int k=j+1;k<n;k++)
Exceptions have stopped.

A
AtomKrieg, 2016-07-25
@AtomKrieg

This: for(int k=j+1;k<n;j++)
Ps The problem is solved differently. We sort, then we give out the first with the last, the second with the penultimate ...

N
nikoyar, 2014-08-29
@nikoyar

I'll add to my question.
With the help of what this can be done, I imagine, but some kind of terrible dumb thing has fallen that I can’t understand, for example, how can I make a replacement in the current Description element.
That is, you can, of course, take simplexmlelement.addchild
, but here I run into the fact that I don’t understand how to tell the created child which parent it needs to get into.

A
akarin, 2014-08-29
@akarin

Try SimpleXML.
php.net/manual/en/simplexmlelement.addchild.php

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question