首页 > 解决方案 > 使用 PHP 更新 XML 文件

问题描述

我希望来自这个了不起的社区的人可以帮助我。我在 PHP 方面并不出色,我在网上找到了一个更新 XML 文件的脚本——它确实有效,因为它执行了 xml 文件中的第一个元素,然后将文件的其余部分弄乱了.

我的供应商向我发送了一个包含更新的库存水平的 XML 文件,但我需要更改文件中的文本。

股票.xml

<?xml version="1.0" encoding="UTF-8"?>
<STOREITEMS>
    <PRODUCT ITEM="1234" NAME="Product Number One">
        <STOCK>In Stock</STOCK>
    </PRODUCT>
    <PRODUCT ITEM="2345" NAME="Product Number Two">
        <STOCK>In Stock</STOCK>
    </PRODUCT>
    <PRODUCT ITEM="3456" NAME="Product Number Three">
        <STOCK>In Stock</STOCK>
    </PRODUCT>
</STOREITEMS>

我需要将 In Stock 更改为 instock 这是我发现的 PHP 代码:

更新库存.php

<?php   
    $xml1=simplexml_load_file('stock.xml');

    $i=-1;
    foreach($xml1->children() as $PRODUCT)
    {
    $i=$i+1;
        $STOCK=$PRODUCT->STOCK;

        if($STOCK=="In Stock")
        {
            $PRODUCT->STOCK[$i]="instock";
        }
    }

    file_put_contents("stock.xml",$xml1->saveXML());

?>

我最终得到这个结果:

股票.xml

<?xml version="1.0" encoding="UTF-8"?>
<STOREITEMS>
    <PRODUCT ITEM="1234" NAME="Product Number One">
        <STOCK>In Stock</STOCK>
    </PRODUCT>
    <PRODUCT ITEM="2345" NAME="Product Number Two">
        <STOCK>In Stock</STOCK><STOCK>instock</STOCK>
    </PRODUCT>
    <PRODUCT ITEM="3456" NAME="Product Number Three">
        <STOCK>In Stock</STOCK><STOCK>instock</STOCK>
    </PRODUCT>
</STOREITEMS>

在第 2 和第 3 个产品上,它没有更新库存文本,而是再次添加了一个名为 stock 的新属性并输入了文本 - 它一直在文件的其余部分执行此操作。

如果有人可以帮助我,我将不胜感激。谢谢大家!乔恩

标签: phpxml

解决方案


This is just because of a slight error with the way you are assigning the new values to your STOCK item:

$PRODUCT->STOCK[$i]="instock";

You have set $i as an increasing number from 0 (on the first iteration). This will set the nth STOCK element to be instock. However, there are no STOCK elements higher than 0 because STOCK is the only child of PRODUCT in each case.

The reason you were getting extra STOCK elements was because they were being created when $i was higher than 0 (STOCK[1] = "instock", STOCK[2] = "instock", etc.).

Simply remove $i completely and use 0 and it will work:

$PRODUCT->STOCK[0]="instock";

Output:

<?xml version="1.0" encoding="UTF-8"?>
<STOREITEMS>
    <PRODUCT ITEM="1234" NAME="Product Number One">
        <STOCK>instock</STOCK>
    </PRODUCT>
    <PRODUCT ITEM="2345" NAME="Product Number Two">
        <STOCK>instock</STOCK>
    </PRODUCT>
    <PRODUCT ITEM="3456" NAME="Product Number Three">
        <STOCK>instock</STOCK>
    </PRODUCT>
</STOREITEMS>

推荐阅读