Well, I were trying to make code that gets a XML element from the file and replaces with new data.

Here is my code.

Parsing command:

function ExecuteCMD($forplayer, $what, $to)
{
$player_dir = 'D:\\Programy\\Open Tibia Server Project\\DeadTouch Binary\\data\\players\\';
$SetPlayer = file_get_contents($player_dir . "\\" . $forplayer . ".xml");
$SetPlayer = str_replace($what, $to, $SetPlayer);
$OpenFile = fopen($player_dir . "\\" . $forplayer . ".xml", "w+");
if ($OpenFile)
{
fwrite($OpenFile,$SetPlayer);
}
fclose($OpenFile);
}

Here is command that function above executed:

require_once('./config.php');
require_once('./pe_ha_pe.php');
$cmd = explode(" ", $_POST);
$player_dir = $data . '\\players\\';
@ $acp_d_file = file_get_contents($player_dir . "\\" . $cmd[1] . ".xml");
@ $System = simplexml_load_string($acp_d_file);
if ($cmd[0] == "/level")
{
if (!$cmd[1] || !$cmd[2])
{
echo 'Not enough of parameters for <B>' . $cmd[0] . '</b> command...';
}
else
{
if (@ !$acp_o_file = fopen($player_dir . "\\" . $cmd[1] . ".xml", "r"))
{
echo 'Player does not exist or nickname is wrong.';
}
else
{
if ($System == $cmd[2])
{
echo 'Provided level and player level is same.';
}
else
{
ExecuteCMD($cmd[1], $System, $cmd[2]);
echo 'Command ' . $cmd[0] . ' with value ' . $cmd[2] . ' used on ' . $cmd[1] . ': <font color="green">SUCCESS</font>';
}
}
}
}

And for example, if I execute command:/level GOD 0

In GOD.xml we'll have:

<?xml version="0.0"?>
<player name="MaestroS" account="0152818" sex="0" lookdir="0" exp="015544804375" voc="01" level="01439" access="0" cap="09810" maglevel="0139" lastlogin="01178140167" lastlogout="01178132522" promoted="0" banned="0">
(...)

When it should look like that:

<?xml version="1.0"?>
<player name="MaestroS" account="152818" sex="0" lookdir="0" exp="15544804375" voc="1" level="0" access="0" cap="9810" maglevel="139" lastlogin="1178140167" lastlogout="1178132522" promoted="1" banned="0">
(...)

The problem is in ExecuteCMD function.
I think it's about str_replace that just works wrong.

How to get an element from file and replace with new provided data correctly ?

Edited 3 Years Ago by happygeek: fixed formatting

What you _could_ do is..
say the XML element is <item>...
You could store all text before and including the <item> tag.

Then store all the text after and including the </item> tag.

Then you can do.

$string = $before . $value . $after;

or you could load the data into an array
and do your changes
then write all the array to the file

This article has been dead for over six months. Start a new discussion instead.