PHP SimpleXMLElement addChild在循环中仅以最大值显示一次

时间:2020-04-08 06:07:42

标签: php xml simplexml

我有一个XML文件:

<include>
    <data>
        <name>Chicken</name>
        <price>1</price>
    </data>
    <data>
        <name>Fish</name>
        <price>5</price>
    </data>
    ...Cut off about 100 lines...
    <data>
        <name>Pig</name>
        <price>105</price>
    </data>
<include>

现在,我想像这样在<id>上方添加升序的<name>

<include>
    <data>
        <id>1203001</id>
        <name>Chicken</name>
        <price>1</price>
    </data>
    <data>
        <id>1203002</id>
        <name>Fish</name>
        <price>5</price>
    </data>
    ...Cut off about 100 lines...
    <data>
        <id>1203105</id>
        <name>Pig</name>
        <price>105</price>
    </data>
<include>

我使用了for循环,这是我的代码:

$data = <<<XML
<include>
    <data>
        <name>Chicken</name>
        <price>1</price>
    </data>
    <data>
        <name>Fish</name>
        <price>5</price>
    </data>
    ...Cut off about 100 lines...
    <data>
        <name>Pig</name>
        <price>105</price>
    </data>
<include>
XML;
for($i = 1203001; $i <= 1203105; $i++) {
    $xml = new SimpleXMLElement($data);
    $xml->data->addChild("id", $i);
}
echo $xml->asXML();

但是,我得到的结果是,<id>仅出现一次,并且最大值位于</data>旁边,而不是我想要的位置:

<include>
    <data>
        <name>Chicken</name>
        <price>1</price>
    <id>1203105</id></data>
    <data>
        <name>Fish</name>
        <price>5</price>
    </data>
    ...

请告诉我一种解决此问题的方法。非常感谢您的解决方案。

1 个答案:

答案 0 :(得分:3)

您每次在循环中都从$xml重新创建$data,因此您将丢弃在上一次迭代中所做的更改。

在循环之前初始化$xml。然后在data个子节点上循环。

$xml = new SimpleXMLElement($data);
$i = 1203001;
foreach ($xml->data as $node) {
    $node->addChild("id", $i++);
}

如果要在<id>节点的开始而不是末尾插入<data>,请参见SimpleXML how to prepend a child in a node?

相关问题