我尝试使用简单的xml和php创建以下xml行:
<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++;
}
但是得到这个错误:
添加属性已存在
错误相当清楚,但我不知道如何创建一个解决方法。
答案 0 :(得分: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();