2016-12-21 3 views
-1

Я пытаюсь создать следующий XML-строку с простым XML и PHP:SimpleXml Добавить атрибут со многим параметром

<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() expects at most 3 parameters, 6 given

Таким образом, я попытался это:

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

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

add Attribute does already exist

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

+0

Так что проблема, ошибка довольно ясно. Хочет не более 3, вы предоставили 6. http://php.net/manual/en/simplexmlelement.addattribute.php – JustBaron

+0

@justbaron Вопрос довольно ясен. Должен быть способ сделать xml похожим на строки выше – utdev

+0

, первая ошибка довольно ясна. Вторая ошибка, вероятно, относится к вашему циклу foreach. В нем перечислены $ langs, $ keys и $ values, ни один из которых не используется в addAttribute, а это означает, что вы пытаетесь добавить атрибут к одному объекту SimpleXML несколько раз. – JustBaron

ответ

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(); 
Смежные вопросы