Simplexml使用许多参数添加属性

时间:2016-12-21 11:37:20

标签: php xml simplexml

我尝试使用简单的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++;
    }

但是得到这个错误:

  

添加属性已存在

错误相当清楚,但我不知道如何创建一个解决方法。

1 个答案:

答案 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();