Я пытаюсь создать следующую строку xml с простыми xml и php:

  <stream languageCode="BG" mpegStreamID="0xBD" mpegSubstreamID="0x20"/>
  <stream languageCode="EN" mpegStreamID="0xBD" mpegSubstreamID="0x21"/>
  <stream languageCode="FR" mpegStreamID="0xBD" mpegSubstreamID="0x22"/>

Пока я делал это в цикле:

foreach($langs as $key => $value)
{
    $this->lang->addAttribute('languageCode', $var1, 'mpegStreamID', '0xBD', 'mpegSubStreamID', '0x2'.$i);
}

Но я получаю следующую ошибку:

SimpleXMLElement :: addAttribute () ожидает не более 3 параметров из 6 заданных

Таким образом я попробовал это:

    foreach($langs as $key => $value)
    {
        $this->streamLang->addAttribute('languageCode', $var);
        $this->streamLang->addAttribute('mpegStreamID', '0xBD');
        $this->streamLang->addAttribute('mpegSubStreamID', '0x2'.$i);
        $i++;
    }

Но получите эту ошибку:

добавить Атрибут уже существует

Ошибки довольно ясны, но я не знаю, как создать обходной путь, так сказать.

-1
utdev 21 Дек 2016 в 14:37
Итак, в чем проблема, ошибка довольно ясна. Требуется максимум 3, вы предоставили 6. php.net/manual/en/simplexmlelement .addattribute.php
 – 
JustBaron
21 Дек 2016 в 14:39
Вопрос довольно ясный. Должен быть способ сделать xml похожим на строки выше
 – 
utdev
21 Дек 2016 в 14:42
Первая ошибка довольно ясна. Вторая ошибка, вероятно, связана с вашим циклом foreach. В нем перечислены $ langs, $ keys и $ values, ни один из которых не используется в addAttribute, что означает, что вы пытаетесь добавить атрибут к одному объекту SimpleXML несколько раз.
 – 
JustBaron
21 Дек 2016 в 14:44
Правильно, но я не знаю, как заставить его работать прямо сейчас
 – 
utdev
21 Дек 2016 в 14:47
2
В обоих ваших циклах вы не используете $ key или $ value , поэтому вы повторяете действия для каждой итерации цикла.
 – 
Parfait
21 Дек 2016 в 14:52

1 ответ

Лучший ответ

Первое сообщение об ошибке самоочевидно, здесь есть некоторые функции, которые позволяют использовать переменное количество аргументов, но большинство из них - нет. SimpleXMLElement::addAttribute() ожидает имя, значение и, возможно, пространство имен. Вы должны вызывать его для каждого атрибута, который хотите добавить.

В цикле вы добавляете 3 атрибута к одному и тому же узлу несколько раз. Итак, во второй итерации атрибут уже существует, и вызов не выполняется.

Здесь недостаточно вашего источника (очевидно, что это часть более крупного класса - вы используете $ this), чтобы рассказать об этом гораздо больше. Но вот полный пример:

$languages = ['BG', "EN", "FR"];

$streams = new SimpleXMLElement('<streams/>');
foreach ($languages as $index => $language) {
  $stream = $streams->addChild('stream');
  $stream->addAttribute('languageCode', $language);
  $stream->addAttribute('mpegStreamID', '0xBD');
  $stream->addAttribute('mpegSubStreamID', '0x2'.($index + 1));
}

echo $streams->asXml();

Это будет выглядеть почти так же, если вы используете DOM:

$languages = ['BG', "EN", "FR"];

$document = new DOMDocument();
$streams = $document->appendChild($document->createElement('streams'));
foreach ($languages as $index => $language) {
  $stream = $streams->appendChild($document->createElement('stream'));
  $stream->setAttribute('languageCode', $language);
  $stream->setAttribute('mpegStreamID', '0xBD');
  $stream->setAttribute('mpegSubStreamID', '0x2'.($index + 1));
}
$document->formatOutput = TRUE;
echo $document->saveXml();
1
ThW 21 Дек 2016 в 16:47