Home > Articles > Programming > Java

📄 Contents

  1. Why XML?
  2. Where Do I Use XML?
  3. HTML Form Data to XML Conversion
  4. Conclusion
  • Print
  • + Share This
Like this article? We recommend

HTML Form Data to XML Conversion

Our objective in this article is to suggest some simple methods to use HTML forms to construct XML documents, which can then be passed to a database or saved as a file. We will start with a simple XML document and then discuss how we can enhance the code to handle more complex XML structures.

A Simple XML Document

In this case, constructing the XML document requires iterating through the form data in the request object and writing the value of each form field as an XML Document Node.

To exclude the form fields that we do not wish to include within the XML document, we will append the string "__exclude__" to the field name in the HTML form data.

Assume that we have a simple XML document that we need to construct, as follows:

<?xml version="1.0"?>
<function>
<func_name>ADD_USER</func_name>
<firstname>Jasmit</firstname>
<middlename>Singh</middlename>
<lastname>Kochhar</lastname>
<address>1234 Some Dr.</address>
<city>Pleasant Hill</city>
<state>CA</state>
<zip>94523</zip>
</function>

The data is captured using the HTML form given as follows (NewUser.html):

<html>
<head><title>New User Information</title></head>
<body>

<form action="ProcessData.asp" method="post" enctype="application/x-www-form-urlencoded">

<h2>Please provide the following information</h2>

<input type="hidden" name="func_name" value="ADD_USER">
 <table>

 <tr><td><b>First Name:</b></td>
   <td><input type="text" name="firstname" size="40"></td></tr>

 <tr><td><b>Middle Name:</b></td>
   <td><input type="text" name="middlename" size="40"></td></tr>
 
 <tr><td><b>Last Name:</b></td>
   <td><input type="text" name="lastname" size="40"></td></tr>

 <tr><td><b>Street Address:</b></td>
   <td><input type="text" name="address" size="40"></td></tr>

 <tr><td><b>City, State - Zip:</b></td>
   <td><input type="text" name="city" size="30">,
     <input type="text" name="state" size="2"> 
<input type="text" name="zip" size="10"></td></tr>

<tr><td colspan="2">
<input type="submit" name="__exclude__Submit" value="Submit">
</td></tr>

</table>
</form>
</body></html>

The only difference in the preceding HTML form is the form field for the button with the name "__exclude__Submit". We wish to include all other input variables as part of the XML document generated.

The form is submitted from a user's Web browser to the Web server that sends the data to the ASP page ProcessData.asp. The details for the page are as follows:

<%

Option Explicit

'-------------------- ProcessData.asp---------------------------------

'--------------------------------------------------------------------
' The Function saveXMLData saves the XML doc in the filename specified.
' The function can be easily adapted to send the data directly to
' a database object
'--------------------------------------------------------------------

Function saveXMLData(strPath, strFileName)

 'Declare local variables.
 Dim aXMLDoc
 Dim aRootNode
 Dim aFormVar
 Dim aPI
 Dim Item

'Create an XMLDOM Object
 Set aXMLDoc = server.CreateObject("Microsoft.XMLDOM")
 aXMLDoc.preserveWhiteSpace = True


'Create the root node for the document
 Set aRootNode = aXMLDoc.createElement("function")
 aXMLDoc.appendChild aRootNode


'Iterate the Request Object for all form data
 For Each item in Request.Form

'Do not include the variable if it contains __exclude__
   If instr(1,item,"__exclude__") = 0 Then
     Set aFormVar =aXMLDoc.createElement(item)
     aFormVar.Text = Request.Form(item)
     aRootNode.appendChild aFormVar
   End If

 Next


'Append the processing instruction

 Set aPI = aXMLDoc.createProcessingInstruction("xml","version='1.0'")
 aXMLDoc.insertBefore aPI, aXMLDoc.childNodes(0)


'Save the XML document.
 aXMLDoc.save strPath & "\" & strFileName


'Release all references.
 Set aXMLDoc = Nothing
 Set aRootNode = Nothing
 Set aFormVar= Nothing
 Set item = Nothing
 Set aPI = Nothing
End Function

' The page starts here
On Error Resume Next

' Save the XML Data
SaveXMLData "c:","NewUser.xml"


If err.number <> 0 then
 Response.write("Errors occurred while saving your information."+ Err.Description)
Else
 Response.write("Thank you for submitting your information.")
End If
%>

A More Complex XML Document

The first approach will work for very straightforward XML document that is easy to construct from the HTML form data posted. Let us consider a little more involved example of the XML document, as follows:

<?xml version="1.0"?>
<function>
<name>ADD_USER</name>
<parameters>
<firstname>Jasmit</firstname>
<middlename>Singh</middlename>
<lastname>Kochhar</lastname>
<contactinfo>
<address>1234 Some Dr.</address>
<city>Pleasant Hill</city>
<state>CA</state>
<zip>94523</zip>
</contactinfo>
</parameters>
</function>

The data is captured using a modified HTML form, as follows (NewUserMod.html):

<html>
<head><title>New User Information</title></head>
<body>

<form action="ProcessData.asp" method="post" enctype="application/x-www-form-urlencoded">

<h2>Please provide the following information</h2>

<input type="hidden" name="1/name" value="ADD_USER">
 <table>

 <tr><td><b>First Name:</b></td>
   <td><input type="text" name="2../parameters/firstname" size="40"></td></tr>

 <tr><td><b>Middle Name:</b></td>
   <td><input type="text" name="3../middlename" size="40"></td></tr>
 
 <tr><td><b>Last Name:</b></td>
   <td><input type="text" name="4../lastname" size="40"></td></tr>

 <tr><td><b>Street Address:</b></td>
   <td><input type="text" name="5../contactinfo/address" size="40"></td></tr>

 <tr><td><b>City, State - Zip:</b></td>
   <td><input type="text" name="6../city" size="30">,
     <input type="text" name="7../state" size="2"> 
<input type="text" name="8../zip" size="10"></td></tr>

<tr><td colspan="2">
<input type="submit" name="Submit" value="Submit">
</td></tr>

</table>
</form>
</body></html>

This form is a little different from the one we created in NewUser.html. There are three primary distinctions:

  • The field names start with the order in which we want them to appear in the XML string. Even though all browsers are supposed to submit the input fields in the same order as they are listed in the HTML form (per the HTTP specification), some browsers do not adhere to this rule. The count in front of the fields ensures that the order of the fields processed is retained.

  • The structure of the XML string is represented in the / notation for traversing a hierarchical tree. If one wants to start an element at the root node, we start the variable with a "/". If we want to process the element with the same parent as the current node, we represent that with "../". Hence, if we wanted to go two levels up, we would represent that as "../../".

  • Finally, any of the HTML form fields that are not to be included in the XML string are represented without any number appended to them. For example, the submit button has no order appended to it.

The form is submitted from the user's Web browser to the Web server, which sends the data to the ASP page ProcessDataMod.asp. The details for the page are as follows:

<%

Option Explicit

'-------------------- ProcessDataMod.asp------------------------------

'----------------------------------------------------------------------
' Function returns the order for the item in the HTML form to be 
' considered for the construction of the XML document. The function
' also returns the name of the valiable with the order removed
'----------------------------------------------------------------------


Function getItemOrder(strItem)

 'Declare the local variables
 Dim totLen
 Dim i
 Dim strTest
 Dim LoopStop
 Dim order
 
 'If the variable does not have an order indicated return order as -1

 order = -1
 i=1
 totLen = Len(strItem)
 if (totLen > 0) then
   LoopStop = false
 end if

 DO UNTIL LoopStop
   strTest = Left(strItem, i)
 
   ' Continue concatenating a character of the string till it
   ' is an integer
   if ((isNumeric(strTest)) and (instr(strTest, ".")=0)) then
    LoopStop = false
   else
    ' The integer has ended in the string
    LoopStop = true
    if ( i> 1) then
' Get the integer part of the variable asthe order for the string
' and copy the rest in the original string variable
      strTest = Left(strItem, i-1)
      strItem = Right(strItem, totLen-i+1)
      order = CInt(strTest)
    end if
   end if
   i = i+1
 LOOP
 getItemOrder = order
end Function

'--------------------------------------------------------------------
' The Function saveXMLData saves the XML doc in the filename specified.
' The function can be easily adapted to send the data directly to
' a database object
'--------------------------------------------------------------------

Function saveXMLData(strPath, strFileName)

 'Declare local variables.
 Dim aXMLDoc
 Dim aRootNode
 Dim aFormVar
 Dim aPI
 Dim Item
 Dim strItem
 Dim OrdrItem
 Dim aDictObj
 Dim maxNum
 Dim ItemsArray
 Dim CurrNode
 Dim NodeName
 Dim i
 Dim j 

'Create an XMLDOM Object
 Set aXMLDoc =server.CreateObject("Microsoft.XMLDOM")
 aXMLDoc.preserveWhiteSpace = True


 'Create the root node for the document
 Set aRootNode = aXMLDoc.createElement("function")
 aXMLDoc.appendChild aRootNode
 
 ' Set the root node of the document as the current node
 Set currNode = aRootNode

 ' Use a dictionary object to store the variables from the
 ' html form so as to retrieve them in the indicated order
 
 Set aDictObj =
 server.CreateObject("Scripting.Dictionary")

 ' Store the order of the last variable in MaxNum
 MaxNum = -1
 
 ' Iterate the Request Object for all form data
 ' and put the variables in the dictionary object
 ' with the key indicating their order
 
 For Each item in Request.Form
   strItem = item
   OrdrItem = getItemOrder(stritem)
   if (MaxNum < OrdrItem) then
    MaxNum = OrdrItem
   end if
   if (OrdrItem > 0) then
   aDictObj.Add OrdrItem, stritem
   end if
 Next
 
 ' Iterate to the value of the variable MaxNum
 ' and process each field as indicated by the 
 ' HTML form element into corresponding leaves
 ' of the XML document
 
 For i = 1 to MaxNum
  if (aDictObj.exists(i)) then
   strItem = aDictObj.Item(i)
   
   ' Parse the variable for all the / which indicate the level
   
   ItemsArray = Split(stritem, "/")
   
   For j= 0 to UBOUND(ItemsArray)
     NodeName = CStr(Trim(ItemsArray(j)))
     if (NodeName = "") then
       ' -- Get the root Node of the XML document
       Set currNode = aRootNode
     elseif (NodeName = "..") then
      ' -- Get the parent of the current node in the XML document
       Set currNode = CurrNode.parentNode
     else
       'Create an element
      Set aFormVar =aXMLDoc.createElement(NodeName)
      currNode.appendChild aFormVar
      Set currNode = aFormVar
     end if
   NEXT  
  ' For the final leaf node get the value submitted in the HTML form 
   currNode.Text = Request.Form(CStr(i)+stritem)
  end if
 Next



'Append the processing instruction
 Set aPI = aXMLDoc.createProcessingInstruction("xml","version='1.0'")
 aXMLDoc.insertBefore aPI, aXMLDoc.childNodes(0)


 'Save the XML document
 aXMLDoc.save strPath & "\" & strFileName


 'Release all object references
 Set aXMLDoc = Nothing
 Set aRootNode = Nothing
 Set aFormVar= Nothing
 Set item = Nothing
 Set aPI = Nothing
 Set currNode = Nothing
 Set aDictObj = Nothing
 
End Function



On Error Resume Next


' Save the XML Data
SaveXMLData "c:","NewUserMod.xml"


If err.number <> 0 then
 Response.write("Errors occurred while saving your information."+ Err.Description)
Else
 Response.write("Thank you for submitting your information.")
End If
%>
  • + Share This
  • 🔖 Save To Your Account