【问题标题】:How to write data from Form in HTML to XML with Javascript如何使用 Javascript 将 HTML 格式的表单中的数据写入 XML
【发布时间】:2011-05-20 02:19:52
【问题描述】:

这是我班上的作业。我需要做的是创建一个注册页面。当用户按下提交按钮时,我已获取表单上的所有信息并使用 Javascript 将其写入现有 XML 文件。这是在客户端完成的,仅通过 HTML、Javascript 和 XML。顺便说一句,我的教授故意不教我们怎么做,因为他想让我们自己研究。另外,我对 Javascript 不太熟悉,尤其是内置函数,如果可能的话,请解释一下每行代码或代码方法的作用。

让我开始吧,这是我现有的 XML 的样子:

    <?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>  

保存表单数据的时候,要按照里面的所有布局,基本上我需要Usrname、Pswd、personid等等。

基本上,据我了解,一旦我按下提交,我就必须从我的注册页面创建 XML 行“Person”。然后将它推送到已经有我的 XML 信息的数组,然后用数组上的信息覆盖我的 XML 文档。我的问题是,我完全不知道该怎么做。

对于那些想知道我的注册页面是什么样子的人,这里是:

    <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>

顺便说一句,我知道我的 HTML 文档中的某些信息可能措辞不当,所以希望你们不要介意。此外,我还必须稍后通过将秘密问题的答案放在后面来修复我的 XML。

好的,非常感谢各位。

更新!!!

到这里,我终于知道如何用 Javascript 创建 XML 文档了,代码如下:

    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()  

这里的代码所做的是,它将我的原始 XML 文件加载到一个数组中,以便它可以创建一个新的 XML 文件。基本上我已经完成了创建 XML 文件的部分,但我的其余部分仍然需要帮助。

我的目标是尝试获取我的表单数据并将其推送到我现有的数组中,而不是覆盖它,添加到它,这样我就可以使用新的注册信息更新我现有的 XML 文件。这是我完全不知道该怎么做的地方。一些指针会很好。

【问题讨论】:

    标签: javascript html xml


    【解决方案1】:

    顺便说一句,我的教授故意不教我们怎么做,因为他想让我们自己研究。

    这应该会给你一个关于更深入搜索的提示。无论如何,我不会评论每一行,但我会提供一些提示。

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

    这是一种 Microsoft 专有的创建 XML 文档的方法,它通常包含在 try..catch 中,因为不同版本的 IE 中提供了不同的 ActiveXObject。您还需要寻找document.implementation.createDocument

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

    您可能需要检查异步参数。

         xmlObj = xmlDoc.documentElement;
        }
    
        //declare & initialize array
        var arrPerson = new Array();
    

    使用数组字面量被认为是更好的做法:... = [];

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

    在每个循环上获取 xmlObj.childNodes 的长度是低效的,考虑存储长度并与该值进行比较。

        {
            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"));
    

    重复访问xmlObj.childNodes(x)是非常低效的。存储引用并重复使用它。

            arrPerson.push(tmpArr);
    

    您可以将值直接分配给 arrPerson 并摆脱 tmpArr

            x++;   
    

    使用普通的 for 循环将为您增加 x。

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

    并非所有浏览器都允许您设置输入元素的背景颜色。

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

    您可能需要一种更好的方法来命名错误消息并将它们与该消息的其他信息相关联。一个对象可能会完成这项工作。

            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)
    

    函数authentication()返回true或false,所以你不需要和任何东西比较,你可以测试返回值(即不需要上面的== true)。

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

    与其在警报中一次显示一条警报消息,不如考虑将它们放在与它们相关的元素相邻的文档中。这样用户可以在修复错误时看到消息。

    【讨论】:

    • 感谢您的提示,请记住它以供将来参考。那里的 Javascript 仅供参考,对于特定的 JS 文件并不需要帮助。警报消息用于测试目的。另外,我现在不打算改变我的程序的布局,因为它是下周到期的,我不想让自己更困惑。非常感谢,一些提示确实帮助了我一些事情。
    【解决方案2】:

    问我们不是作弊吗?您的实现可能只适用于 IE,我建议使用 jQuery,因为它在解析 XML 方面非常强大。

    我不确定他为什么要你写出 XML,因为它来自 JavaScript 不是很直观。你可以通过 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
      });
    
    });
    

    如何“报告”此 xml 文件由您决定

    【讨论】:

    • 哇,我打酱油太重了,意思是说 IE
    • 这不是真正的作弊,因为他说我们可以用任何方法找出方法,因为他不会教我们。另一件事,我们只限于 HTML、Javascript 和 XML,不能使用其他任何东西。另外,我什至不知道 jQuery,所以这甚至没有帮助。在 IE 上使用很好,如果您查看我的代码,它几乎只适用于 IE。
    • jQuery 是 JavaScript,手动解析 XML 节点会导致代码比您提供的更多。
    • 我明白了,不知道jQuery基本上是Javascript。问题是,我不知道 jQuery 是如何工作的,而且我几乎不熟悉 Javascript。
    • 不要使用 jQuery,创建 XML 文档和加载文件所需的脚本很少。您可以用大约 20 或 30 行代码完成您需要的工作,并且您实际上会学到一些有用的东西,而不是如何使用其他人的 API。
    【解决方案3】:

    这里分享我将html表单数据写入xml的经验。

    1. 在一个位置创建一个 html 文件 (D:\\HtmlToXml.html)。
    2. 然后用 Internet Explorer 打开它。
    3. 然后在提供信息并单击提交按钮后,在同一目录中创建一个名为example.xml的文件。
    4. 如果一旦创建了 xml,那么下次提交按钮点击数据将附加到同一个 xml 文件。

        <!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>
            

    【讨论】:

    • @Prasad,这些验证对我来说工作正常,但它没有创建任何 Xml 文件,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2019-01-31
    相关资源
    最近更新 更多