2

Hi stackoverflow community, I have an HTML, XML, JS related problem...

Im learning a bit of web programming languages and as a project I started making a JS-based browser game. On an earlier project, I had some trouble when I wanted to save the Highscores to a MySQL database (from JS variable to php variable). In the end, I found a way to avoid this by placing the scores in a hidden div, and by using HTML DOM placing the score in a form (JS -> PHP -> MySQL).

Now, on this project, I started using this technique to avoid a lot of JS-scripting, and using the hidden div as a sort of temporary memory. But it turned out to be some very messy code so I wanted to try using XML for putting temporary data away. I checked out the W3-schools site and adapted my code.

The game is a sort of turn-price game (very simple), where each 'day' prices get renewed and you make money by selling stuff you bought a day earlier at a cheaper price. I wanted to save the prices of the day earlier, to make a 'Your profit is: $ .....' menu. So, I thought putting the data in an XML file, so I could easily save the data and recall it later.

Now the problem is, that the data doesn't get saved at all. When I leave a JS-function, the XML-file is 'reset', all the data is lost... How can I save the XML file on the server?

Just to make things clear, I added my code, but I know it is very messy (first time I use XML :)... So I added some comments, I hope it helps. To make the problem concrete: when the nextDay() function fires, it should save the prices from the previous day, and then renew the prices, but they don't get saved.

PriceGame /* Function to randomise the prices at the start of a new day */

        function randomPrice(n){
            var price;
            var R;
            var P;

            P = n * ((Math.random() * 4) / 10)

            R = Math.random();
            if (R > .5) {
                price = n + P;
                price = price.toFixed(2);
                return price;
            }

            if (R < .5) {
                price = n - P;
                price = price.toFixed(2);
                return price;
            }
        }





        /* Function that fires when an user clicks on a 'Next day'-button, the prices get reset */

        function nextDay(){

            /* Acces XML file */

            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            }
            else {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET", "XML.xml", false);
            xmlhttp.send();
            xmlDoc = xmlhttp.responseXML;

            /* ERROR: Saving the prices from the day earlier, but this doesn't work */

            for (i = 0; i < 26; i++) { /* loop for selecting all of the 26 products */
                x = xmlDoc.getElementsByTagName("pricetoday")[i].childNodes[0];

                price = x.nodeValue;
                x = xmlDoc.getElementsByTagName('priceyesterday')[i].childNodes[0];
                x.nodeValue = price;

                     }

/* I was checking if I could request the values from the XML file by putting them in a div, just to see if it works, but i keep on getting a my 'Null' default value ... */

 x = xmlDoc.getElementsByTagName('priceyesterday')[i].childNodes[0];
                priceYesterday = x.nodeValue;
 document.getElementById(i+27).innerHTML = priceYesterday; /* Puts prices Yesterday in a div */


            /* Renewal of prices */

            for (i = 0; i < 26; i++) {
                x = xmlDoc.getElementsByTagName('pricebase')[i].childNodes[0]; /* the basic price is selected for each product */
                basePrice = x.nodeValue;

                n = parseFloat(basePrice);
                randomisedPrice = randomPrice(n); /* The basic price is randomised, added or substracted 40% */
                x = xmlDoc.getElementsByTagName('pricetoday')[i].childNodes[0]; /* Saves prices in XML file */
                x.nodeValue = randomisedPrice;
            }



            /* Display price and product */

            for (i = 0; i < 26; i++) {
                x = xmlDoc.getElementsByTagName("product")[i].childNodes[0]; /* Selects productsname, maybe unnessecary, but is saves some HTML code */
                product = x.nodeValue;

                x = xmlDoc.getElementsByTagName("pricetoday")[i].childNodes[0];

                price = x.nodeValue;

                document.getElementById(i + 1).innerHTML = product + ": $" + price; /* Displays products and according price */
            }




            /* adds a day */

            x = xmlDoc.getElementsByTagName('day')[0].childNodes[0];
            xparsed = parseFloat(x.nodeValue);
            dayAdded = xparsed + 1;

            x.nodeValue = dayAdded;
            document.getElementById('daycount').innerHTML = dayAdded; /* Displays the number of days passed */
        }

       /* Function that fires onload, sets the day-count to 1 and resets the prices to random values */ 
        function newDay(){

/* Acces XML file */

            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            }
            else {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET", "XML.xml", false);
            xmlhttp.send();
            xmlDoc = xmlhttp.responseXML;

            /* Renewal of prices */

            for (i = 0; i < 26; i++) {
                x = xmlDoc.getElementsByTagName('pricebase')[i].childNodes[0];
                basePrice = x.nodeValue;

                n = parseFloat(basePrice);
                randomisedPrice = randomPrice(n);

                x = xmlDoc.getElementsByTagName('pricetoday')[i].childNodes[0];
                x.nodeValue = randomisedPrice;
            }



            /* Display price and product */

            for (i = 0; i < 26; i++) {
                x = xmlDoc.getElementsByTagName("product")[i].childNodes[0];

                product = x.nodeValue;

                x = xmlDoc.getElementsByTagName("pricetoday")[i].childNodes[0];

                price = x.nodeValue;

                document.getElementById(i + 1).innerHTML = product + ": $" + price;

            }

            /* set daycounter to 1 */

            x = xmlDoc.getElementsByTagName("day")[0].childNodes[0];
            x.nodeValue = 1;



        }
    </script>

2 Answers 2

1

You're not sending the modified XML document to the server anywhere. Updating the DOM tree on the client does not magically update it on the server: You'll have to make another XmlHttp request to achieve this.

Sign up to request clarification or add additional context in comments.

1 Comment

After some looking around, it seems you CAN retrieve data from an XML file by inserting it into a DOM object, but you can't send it back to the server... Any other suggestions?
0

When you have the final DOM document, post it to a php page that will save the XML.

<?php

//Grab domtree from your jsscript on another page that you've posted here //Manipulate to dom $xml = $_POST['value']; $xml_to_add=new DOMDocument(); $xml_to_add->loadXML($xml); $xml_root=$xml_to_add->documentElement;

//Get the file you want to modify on the server (some xml file)

 $xdoc = new DOMDocument();
    $xdoc->load($file);

//Here goes some code where you can either replace everything in this file, or modify it using the value posted

//But when you're done, you want to save your file on the server $xdoc->save($file);

?>

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.