【问题标题】:PHP SimpleXMLElement addChild in a loop only show once with largest value循环中的PHP SimpleXMLElement addChild仅显示一次最大值
【发布时间】:2020-04-08 06:07:42
【问题描述】:

我有一个 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>

现在,我想在&lt;name&gt; 正上方添加升序&lt;id&gt;,如下所示:

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

但是,我得到的结果是&lt;id&gt; 只出现了一次,并且值最大,在&lt;/data&gt; 旁边,而不是我想要的位置::

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

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

【问题讨论】:

  • 我喜欢 SimpleXML 的一点是,除了 addChild(),您还可以使用对象表示法来设置新值 $data-&gt;id = $i;

标签: php xml simplexml


【解决方案1】:

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

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

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

如果您想在&lt;data&gt; 节点的开头而不是末尾插入&lt;id&gt;,请参阅SimpleXML how to prepend a child in a node?

【讨论】:

  • 我按照你的指示做了,虽然&lt;id&gt;自己增加了但是我有问题&lt;id&gt;&lt;data&gt;&lt;/data&gt;在同一行,&lt;id&gt;在最后而不是上面的&lt;name&gt; 像这样:&lt;id&gt;1203XXX&lt;/id&gt;&lt;/data&gt; &lt;data&gt;。这是结果的快照:Resuilt 这是代码:Code
  • SimpleXMLElement 无法在除节点末尾之外的任何位置添加。请参阅 stackoverflow.com/questions/2092012/… 了解如何预先添加。
  • 我做到了,将该指南与替换结合使用。现在想把整个&lt;id&gt;移动到&lt;name&gt;,有什么办法吗?
  • 我不确定你的意思是什么,这不是那个问题显示的意思吗?通常,XML 节点中的标签顺序无关紧要。
  • 目前&lt;id&gt;&lt;price&gt;之下,请问有没有办法将整个&lt;id&gt;移到&lt;name&gt;之上?因为地处尽头,观察难度较大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2017-02-12
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多