PHP SimpleXMLElement addChild в al oop показывается только один раз с наибольшим значением - PullRequest
1 голос
/ 08 апреля 2020

У меня есть 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 l oop, вот мой код:

$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 Ответ

3 голосов
/ 08 апреля 2020

Вы воссоздаете $xml из $data каждый раз через l oop, поэтому вы отбрасываете изменения, сделанные на предыдущей итерации.

Инициализируйте $xml до того, как l oop. Затем l oop над data дочерними узлами.

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

Если вы хотите вставить <id> в начало узла <data> вместо конца, см. Simple XML как добавить ребенка в узел?

...