通过循环遍历数组来构建嵌套的xml

时间:2012-11-16 19:20:17

标签: xml simplexml

我创建了一个简单的方法,用于接受$ key => $ value对的数组。我想循环遍历该数组并构建一个simpleXML对象。该方法几乎可行;但是,它会在每次迭代时覆盖我的子节点。

代码:

public function format_comment($fieldValues)
{
    $xml = new SimpleXMLElement("<ROOT></ROOT>");
    foreach($fieldValues as $field=>$value)
    {
        if($field=='header')
        {
            $xmlChange = $xml->addChild('CHANGE');
            $xmlChange->addAttribute('field', $value);
        }
        elseif($field=='subheader')
        {
            $newXML = $xmlChange->addChild('NEW');
            $newXML->addAttribute('field', $value);
        }
        elseif($field=='newvalue')
        {
            $xmlNewValue = $newXML->addChild('VALUE', $value);
        }
        elseif($field=='oldvalue')
        {
            $xmlFrom = $xmlChange->addChild('FROM');
            $xmlFrom->addAttribute('field', $field);
            $xmlFromValue = $xmlFrom->addChild('VALUE', $value);
        }
    }
    return($xml->asXML());
}

作为输入,我使用以下数组:

$note_fields = array('header'=>'Communication', 'subheader'=>'contacted', 'newvalue'=>'Dale J Neimeier','header'=>'Communication', 'subheader'=>'note', 'newvalue'=>'blah blah blah', 'header'=>'Communication', 'subheader'=>'note', 'newvalue'=>'new text', 'oldvalue'=>'previous text');

我的输出如下:

<ROOT>
    <CHANGE field="Communication">
        <NEW field="note">
            <VALUE>new text</VALUE>
        </NEW>
        <FROM field="oldvalue">
            <VALUE>previous text</VALUE>
        </FROM>
    </CHANGE>
</ROOT>

我可以看到通过我的数组的每次迭代,“CHANGE”标记及其所有子项都会被覆盖。我只是无法弄清楚为什么以及如何解决它。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

问题实际上是我构建$ note_fields数组的方式。由于我有重复键,他们只是相互覆盖。