Используйте PHP для обновления файла XML - PullRequest
0 голосов
/ 02 октября 2019

Я надеюсь, что кто-то из этого удивительного сообщества сможет мне помочь. Я не гениален, когда дело доходит до PHP, я нашел онлайн-скрипт для обновления XML-файла - и он работает, в том смысле, что он выполняет первый элемент в XML-файле, а затем портит остальную часть файла. .

Мой поставщик отправляет мне файл XML с обновленными уровнями запасов, но мне нужно изменить текст внутри файла.

stock.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-код, который я нашел, чтобы сделать это:

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

?>

Я заканчиваю сэтот результат:

stock.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 ивведите текст - и он делает это на протяжении всего файла.

Если кто-то может мне помочь, я был бы очень признателен. Спасибо всем! Jon

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Это просто из-за небольшой ошибки при назначении новых значений вашему элементу STOCK:

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

Вы установили $i как возрастающее число от 0 (вкл. первая итерация). Это установит элемент nth STOCK равным instock. Однако нет элементов STOCK выше 0, поскольку STOCK является единственным потомком PRODUCT в каждом случае.

Причина, по которой вы получили дополнительные элементы STOCK, заключается в том, что они создавалиськогда $i было больше 0 (STOCK[1] = "instock", STOCK[2] = "instock" и т. д.).

Просто полностью удалите $i и используйте 0, и оно будет работать:

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

Вывод:

<?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>
0 голосов
/ 02 октября 2019

Это правильный способ сделать это. Я проверил код сам и работает.

$xml=simplexml_load_file("stock.xml") or die("Error: Cannot create object");
foreach($xml->children() as $data) {         
 echo $data->STOCK . "<br>"; 

if($data->STOCK =='In Stock'){
$data->STOCK='instock';
//htmlentities($xml->save('stock.xml'));
file_put_contents("stock.xml",$xml->saveXML());

}    
} 

echo "success";

дайте мне знать, если у вас все еще есть проблемы ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...