Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write data from Form in HTML to XML with Javascript

This is an assignment from my class. What I need to do is create a registration page. When the user presses the submit button, I have take all the information on the form and write it to an existing XML file using Javascript. This is done on the client side, only through HTML, Javascript, and XML. By the way, my Professor purposely did not teach us how to do this because he wants us to research on it by ourselves. Also, I'm not too familiar with Javascript, especially with the built in functions, if possible please explain what each line or method of code is doing.

Let me begin, here's how my existing XML looks like:

    <?xml version ="1.0" encoding="utf-8" ?>
    <!--GGFGFGFVBFVVVHVBV-->
    <PersonInfo>
      <Person Usrname="Bob111" Pswd="Smith111" personid="111" FirstName="Bob" LastName="Smith" DOB="01/01/1960" Gender="M" Title="Hello1"> 
      </Person>
    <!-- several more lines of <person> here --> 
    </PersonInfo>  

When saving the form data, it has to follow all the layout within , basically I would need Usrname, Pswd, personid, and so on.

Basically, from what I understand, I have to create the XML line "Person" from my registration page once I press submit. Then push it to the array that already have my XML information, then write over my XML document with the information on the array. My problem is, I have exactly no idea how to do that.

For those who wants to know how my registration page looks like, here it is:

    <html>

    <head>
    <title>Registration</title>
    <link rel="stylesheet" type="text/css" href="CSS_LABs.css" />
    </head>


    <body>

    <div class="form">
    <form id="Registration" action="" method="get">

    Username:<input type="text" name="usrname" maxlength="10"/> <br/>
    Password:<input type="password" name="pswd" maxlength="20"/> <br/>

    <hr>

    PersonID:<input type="text" name="PID" /> <br>

    <hr>

    First Name:<input type="text" name="fname"/> <br>
    Last Name:<input type="text" name="lname"/>

    <hr>

    DOB:<input type="text" name="dob" /> <br>

    <hr>

    Gender:<input type="text" name="sex" /> <br>

    <hr>

    Title:<input type="text" name="title" /> <br>

    <hr>

    Secret Question:<br>
    <select name="secret?">
    </select> <br>

    Answer:<input type="text" name="answer" /> <br> <br>

    <input type="submit" value="submit" />
    </form>
    </div>

    </body>

    </html>

By the way, I know certain information on my HTML document may not be worded properly, so do hope you guys don't mind. Also, I would also have to fix up my XML later by putting the answer to the secret question within later.

Alright, thanks a lot in advance guys.

UPDATE!!!

Here we go, I finally figured out how to create an XML document with Javascript, here's the code:

    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var FILENAME = 'G:\\CST2309 - Web Programming 1\\Copy of Take Home Exam - Copy\\PersonXML2.xml';

    function SaveXML(UserData) 
    {   
        var file = fso.CreateTextFile(FILENAME, true);
        file.WriteLine('<?xml version="1.0" encoding="utf-8"?>\n');
        file.WriteLine('<PersonInfo>\n');

        for (countr = 0; countr < UserData.length; countr++) {
            file.Write('    <Person ');
            file.Write('Usrname="' + UserData[countr][0] + '" ');
            file.Write('Pswd="' + UserData[countr][1] + '" ');
            file.Write('PersonID="' + UserData[countr][2] + '" ');
            file.Write('FirstName="' + UserData[countr][3] + '" ');
            file.Write('LastName="' + UserData[countr][4] + '" ');
            file.Write('Gender="' + UserData[countr][5] + '" ');
            file.Write('DOB="' + UserData[countr][6] + '" ');
            file.Write('Title="' + UserData[countr][7] + '"');
            file.WriteLine('></Person>\n');
        } // end for countr

        file.WriteLine('</PersonInfo>\n');
        file.Close();

    } // end SaveXML function --------------------

    function LoadXML(xmlFile) 
    {
        xmlDoc.load(xmlFile);
        return xmlDoc.documentElement;
    } //end function LoadXML()

    function initialize_array() 
    {
        var person = new Array();
        var noFile = true;
        var xmlObj;
        if (fso.FileExists(FILENAME)) 
        {
            xmlObj = LoadXML(FILENAME);
            noFile = false;
            } // if
        else 
        {
            xmlObj = LoadXML("PersonXML.xml");
            //alert("local" + xmlObj);
            } // end if

        var usrCount = 0;
        while (usrCount < xmlObj.childNodes.length) 
        {
            var tmpUsrs = new Array(xmlObj.childNodes(usrCount).getAttribute("Usrname"),
                                    xmlObj.childNodes(usrCount).getAttribute("Pswd"),
                        xmlObj.childNodes(usrCount).getAttribute("PersonID"),
                                    xmlObj.childNodes(usrCount).getAttribute("FirstName"),
                                    xmlObj.childNodes(usrCount).getAttribute("LastName"),
                                    xmlObj.childNodes(usrCount).getAttribute("Gender"),
                                    xmlObj.childNodes(usrCount).getAttribute("DOB"),
                                    xmlObj.childNodes(usrCount).getAttribute("Title"));
            person.push(tmpUsrs);
            usrCount++;
             }   //end while
        if (noFile == false)
            fso.DeleteFile(FILENAME);
        SaveXML(person);
    }   // end function initialize_array()  

What this code here is doing is that, it takes my original XML file and loads it up into an array so it can create a new XML file. Basically I got the creating the XML file part down, but still need help with the rest of my stuff.

My goal is trying to take my form data and push it into my existing array, not overwrite it, add to it, so I can update my existing XML file with the new registration information. This is where I have absolutely no idea how to do. Some pointers would be nice.

like image 320
MNX1024 Avatar asked May 20 '11 02:05

MNX1024


3 Answers

By the way, my Professor purposely did not teach us how to do this because he wants us to research on it by ourselves.

Which should give you a hint about searching a bit more deeply. Anyhow, I'm not going to comment on every line, but I will offer some hints.

 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

That is a Microsoft proprietary way of creating an XML document and it is normally wrapped in try..catch as different ActiveXObjects are provided in different versions of IE. You also need to look for document.implementation.createDocument.

    //DEFINE LOAD METHOD
    function LoadXML(xmlFile)
    {
     xmlDoc.load(xmlFile);

You might want to check out the async parameter.

     xmlObj = xmlDoc.documentElement;
    }

    //declare & initialize array
    var arrPerson = new Array();

It is considered better practice to use an array literal: ... = [];

    //initialize array w/ xml
    function initialize_array()
    {
    LoadXML("PersonXML.xml");
    var x = 0;
    while (x < xmlObj.childNodes.length)

Getting the length of xmlObj.childNodes on every loop is inefficient, consider storing the length and comparing with that value.

    {
        var tmpArr = new Array(xmlObj.childNodes(x).getAttribute("Usrname"), 
                               xmlObj.childNodes(x).getAttribute("Pswd"), 
                               xmlObj.childNodes(x).getAttribute("FirstName"), 
                               xmlObj.childNodes(x).getAttribute("LastName"), 
                               xmlObj.childNodes(x).getAttribute("DOB"),
                               xmlObj.childNodes(x).getAttribute("Gender"),  
                               xmlObj.childNodes(x).getAttribute("Title"));

It is very inefficient to access xmlObj.childNodes(x) repeatedly. Store a reference and reuse it.

        arrPerson.push(tmpArr);

You could assign the values directly to arrPerson and get rid of tmpArr.

        x++;   

Using a plain for loop will increment x for you.

    }
    }

    //Validation
    function LogInVal(objtxt)
    {
        if(objtxt.value.length == 0)
        {
            objtxt.style.background = "red";
            return 1;
        }

        else
        {
            objtxt.style.background = "white";
            return 0;
        }
    }

Not all browsers will let you style the background color of input elements.

    //main validation
    function MainVal(objForm)
    {
        var errmsg = "empty field";
        var errmsg2 = "Incorrect Username and Password";

You might want a better way of naming the error messages and relating them to other information for that message. An object might do the job.

        var msg = "You have logged in successfully";
        var errCount = 0;

        var usrn = document.getElementById("usrname1").value;
        var pswd = document.getElementById("pswd1").value;

        errCount += LogInVal(objForm.usrname);
        errCount/*1*/ += LogInVal(objForm.pswd);

        initialize_array();    

        if (errCount != 0)
        {
            alert(errmsg);
            return false;
        }
        else if(authentication(usrn, pswd) == true)

The function authentication() returns true or false, so you don't need to compare it to anything, you can just test the returned value (i.e. there is no need for == true above).

        {

            alert(msg);
            return true;
            setCookie('invalidUsr',' ttttt');
        }
        else
        {
            alert(errmsg2);
            return false;
        }
    }

Instead of showing alert messages one at a time in an alert, consider putting them in the document adjacent to the elements they relate to. That way the user can see the messaeg while fixing the error.

like image 159
RobG Avatar answered Nov 18 '22 13:11

RobG


Isn't it cheating to ask us? Your implementation will probably only work in IE, I'd recommend using jQuery as it is impressively powerful at parsing XML.

I'm not sure why he wants you to write out XML as it's not very intuitive coming from JavaScript. You can do something like this via jQuery

//I capture form submitevent

$('form').submit(function( ev ){
  ev.preventDefault(); //I keep form from submitting
  $( xmlDocument ).find('Person').attr({
    username: $("input[name=usrname]),
    password: $("input[name=pswd]),
    //and so on
  });

});

It's up to you on how you 'report' this xml file

like image 21
Drew Avatar answered Nov 18 '22 11:11

Drew


Here i am sharing my experience in writing html form data to xml.

  1. Create one html file in one location (D:\\HtmlToXml.html).
  2. And open it with Internet Explorer.
  3. Then after provide information and click on submit button, then one file is created in the same directory with name example.xml.
  4. If once an xml is created, then next time onwards on submit button click data will append to same xml file.

    <!DOCTYPE html>
    <html>
    <head>

        <title>Display Emp Details</title>

        <script type="text/javascript" language="javascript">

    	var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        	var fso = new ActiveXObject("Scripting.FileSystemObject");	
        	var FILENAME='D:\\example.xml';



    function SaveXMLData()
    {
     	validations();
    }


    function createfile()
    {

    	var file;

        	var e1=document.getElementById('empName').value;
        	var p1=document.getElementById('empNumber').value;
        	var em1=document.getElementById('empEmail').value;
        	var d1=document.getElementById('empDate').value;

        	var tablemain = document.getElementById('tblmain');

    	if(fso.fileExists(FILENAME))
        	{
    		xmlDoc.load(FILENAME);
        		var lng;
        		lng=xmlDoc.getElementsByTagName("Details");

        		var xmlread= fso.OpenTextFile(FILENAME,1,true,0);

        		var x=xmlread.readAll();
        		var replace=x.replace('</Emp>','');
        		var sno=lng.length + 1;
        		file=fso.OpenTextFile(FILENAME,2,true);

        		file.writeLine(replace);

        		file.WriteLine('<Details category="'+sno+'">');
        		file.WriteLine('<SNo>'+sno+'</SNo>');
        		file.WriteLine('<Name>'+e1+'</Name>');
        		file.WriteLine('<PhoneNumber>'+p1+'</PhoneNumber>');
        		file.WriteLine('<Emailid>'+em1+'</Emailid>');
        		file.WriteLine('<Date>'+d1+'</Date>');

        		file.WriteLine('</Details>');
        		file.WriteLine('</Emp>');
        		
    		alert('another file updated');
        	}
        	else
        	{

        		file= fso.CreateTextFile(FILENAME, true);
        		file.WriteLine('<?xml version="1.0" encoding="utf-8" ?>');
    		file.WriteLine('<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>');
        		file.WriteLine('<Emp>');
        		file.WriteLine('<Details category="1">');
        		file.WriteLine('<SNo>'+1+'</SNo>');
        		file.WriteLine('<Name>'+e1+'</Name>');
        		file.WriteLine('<PhoneNumber>'+p1+'</PhoneNumber>');
        		file.WriteLine('<Emailid>'+em1+'</Emailid>');
        		file.WriteLine('<Date>'+d1+'</Date>');

        		file.WriteLine('</Details>');
        		file.WriteLine('</Emp>');     

    		alert('file updated');
        	}

    	<!-- displayData();-->

    	document.getElementById('empName').value='';
    	document.getElementById('empNumber').value='';
    	document.getElementById('empEmail').value='';
    	document.getElementById('empDate').value='';

    addRow('tablemain');
    	file.close();
    }

         
    function validations() 
    {
    	var emp1=document.getElementById('empName').value; 
            var letters = /^[\s A-Za-z]+$/; 
            if(emp1!="")
            {
            	if(emp1.match(letters)) 
              	{
    	    		allnumeric();
              	}
              	else 
    	        {
              		alert('Please input alphabet characters only'); 
              		return false; 
              	}
            }
    	else
    	{
    	  	alert('Please Enter Name.');
     	}
    }

            
    <!--For checking Email-->

    function checkemail()
    {
    	var email = document.getElementById('empEmail');
            var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

    	if(email.value!="")
    	{
            	if (!filter.test(email.value)) 
    		{
            		alert('Please provide a valid email address');
            		return false;
            	}
                    else
                    {
                    	DateValidation();
                    }
           	}     
    	else
    	{
    		alert('Please Enter Email.');
    	}
    }


    <!--For checking Date Format-->

    function DateValidation()
    {
        	var date=/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{2,4}$/;
        	var empDate=document.getElementById("empDate");

    	if(empDate.value!="")
          	{
    	    	if(empDate.value.match(date))
    	    	{
    	    		createfile();
    	    	}
    	    	else
    		{
        	     		alert("Please provide valid date : DD-MM-YY(YYYY)");
    			return(false);
    	    	}
          	}
    	else
    	{
    		alert('Please Enter Date.');
    	}
    }


    <!--For checking phone number-->

    function allnumeric() 
    {
    	var numbers=/^\d{10}$/;
        	var empNumber=document.getElementById("empNumber");
    	if(empNumber.value!="")
    	{
    		if(empNumber.value.length=="10")
    		{
        			if(empNumber.value.match(numbers))
        			{
           				checkemail();
        			}
        			else
    			{
    	    			alert("Phone number should be numeric");
        				return(false);
    			}
    		}
    		else
    		{
    			alert('Phone Number should be like: 9876543210');
    		}
    	}
    	else
    	{
    		alert('Please Enter Phone Number.');
    	}
    }



    function addRow(id) 
    {

        if(fso.fileExists(FILENAME))
        {

    	xmlDoc.load(FILENAME);
        	var x;
        	x=xmlDoc.getElementsByTagName("Details");

            var table = document.getElementById('tbl');        



    	var nxtbtn= document.getElementById("btnnext");
    	var prvbtn=document.getElementById("btnprev");
    	nxtbtn.disabled=true;
    	prvbtn.disabled=true;
    	if(x.length >5)
    	{
    		nxtbtn.disabled=false;
    	}
    	var j=0;k=5;
    	if(k>x.length)
    	{k=x.length;}

    	var store=document.getElementById("txtstore");
    	var maxval=document.getElementById("txtmax");

    	if(id=="btnprev")
    	{        
    		if((store.value % k)==0)
    		{
    			store.value = store.value - k ;
    			if(store.value>0)
    			{
    				j = parseInt(store.value);
    				k += parseInt(store.value);
    			}
    		}
    		else
    		{
    			store.value =store.value - (store.value % k) ;

    			if(store.value >0)
    			{
    				j = store.value - k;
    				k = store.value;
    			}
    	
    		}
    	
    		if(j > 0)
    		{
    			prvbtn.disabled=false;
    		}

    	}
    	if(id=="btnnext")
    	{
    		if(store.value==0)
    		{
    			store.value=table.rows.length;
    		}
    		else if(store.value <0)
    		{
    			store.value=maxval.value;
    		}
    		prvbtn.disabled=false;
    	    	if(store.value >=k)
    		{
    			j +=parseInt(store.value);
    			k +=parseInt(store.value);
    			if(k >= x.length)
    			{
    				k=x.length;
    				nxtbtn.disabled = true;
    				prvbtn.disabled = false;
    			}
    		}
    	}

    	table.innerHTML = "";
    	var rowCount = 0;

         	for (i=j;i<k;i++)
    	{
         
            	var row = table.insertRow(rowCount);

    	        var cell1 = row.insertCell(0);
            	var element1 = document.createElement("input");
    	        element1.type = "checkbox";
    	        element1.id =  "id2" ;
            	cell1.appendChild(element1);

    	        // Create label
            	var label = document.createElement("label");
    	        label.htmlFor =  "id2" ;
            	cell1.appendChild(label);

    	        var cell2 = row.insertCell(1);
            	cell2.innerHTML = x[i].getElementsByTagName("SNo")[0].childNodes[0].nodeValue;

    	        var name = row.insertCell(2);
            	var elname =document.createElement("input");
    	        elname.type = "text";
    		elname.readOnly=true;
    		elname.value=x[i].getElementsByTagName("Name")[0].childNodes[0].nodeValue;
    	        name.appendChild(elname);

    	        var phnno = row.insertCell(3);
            	var elphn =document.createElement("input");
    	        elphn.type = "text";
    		elphn.readOnly=true;
    		elphn.value=x[i].getElementsByTagName("PhoneNumber")[0].childNodes[0].nodeValue;
            	phnno.appendChild(elphn);

    	        var email = row.insertCell(4);
            	var elemail =document.createElement("input");
    	        elemail.type = "text";
    		elemail.readOnly=true;
    		elemail.value=x[i].getElementsByTagName("Emailid")[0].childNodes[0].nodeValue;
            	email.appendChild(elemail);

    	        var date = row.insertCell(5);
            	var eldate =document.createElement("input");
    	        eldate.type = "text";
    		eldate.readOnly=true;
    		eldate.value=x[i].getElementsByTagName("Date")[0].childNodes[0].nodeValue;
            	date.appendChild(eldate);
    	
    		rowCount +=1;
         	}
    	maxval.value=x[table.rows.length - 1].getElementsByTagName("SNo")[0].childNodes[0].nodeValue;

    	if(id=="btnprev")
    	{
    	 store.value =store.value - 5;
    	}
    	 else
    	{
        	 store.value =parseInt(k);
    	}
       }
    }

        </script>
    </head>

    <body onload="addRow('tbl')">

    	<form id="empForm" action="" method="get">

        	<p><b>Emp Registration:</b></p>

        	<table>
        		<tr>
        			<td>Name:</td>
        			<td><input type="text" id="empName" maxlength="25"/></td>
        		</tr>
        		<tr>
        			<td>Phone Number:</td>
        			<td><input type="text" id="empNumber" maxlength="10"/></td>
        		</tr>
    	    	<tr>
        			<td>EmailId:</td>
        			<td><input type="text" id="empEmail"/></td>
        		</tr>
        		<tr>
        			<td>Date:</td>
        			<td><input type="text" id="empDate" maxlength="10"/></td>
        		</tr>
        		<tr>
        			<td align="center">
    			<input type="button" value="Submit" onclick="SaveXMLData()"/></td>
        			<td>
    			<input type="button" value="Show Data" id="show" onclick="displayData(this.id)" style="display:none;"/></td>
        		</tr>
        	</table>
    	<!-- <table><tr><td><input type="button" onclick="displayData(this.id)" value="Prev" id="prev" disabled="disabled"></td>
    	   <td><input type="button" onclick="displayData(this.id)" value="Next" id="next" disabled="disabled"></td></tr></table> -->

     	<div id='displaydatadiv'>	
        	</div>
    	<!-- <INPUT type="button" value="Add Row" onclick="addRow('tbl')" /> -->
    	
    	<div style="height: 135px; width:650px; background-color: Lavender;" >
    		<TABLE id="tbl" width="350px">    
      		</TABLE>
    	</div>
    	<table id="tblmain" border="1" style="display:true" ></table>
    		<input type="button" id="btnprev" value="Prev" onclick="addRow(this.id)" disabled="disabled">
    		<input type="button" id="btnnext" value="Next" onclick="addRow(this.id)" disabled="disabled">

    		<input type="hidden" id="txtstore" style="display:none;">
    		<input type="hidden" id="txtmax" style="display:none;">

    </body>
    </html>
        
like image 38
Venkata Prasad Avatar answered Nov 18 '22 11:11

Venkata Prasad