Reputation: 1469
I have a form written in VB.NET with ASP.NET that writes the users data to an XML file. Each time the form is used, a new XML file is generated with the data provided via the form. My problem is I'm trying to get the XML output to resemble:
<PersonalData>
<products>
<product>
<productID>1</productID>
<productNumber>123456</productNumber>
</product>
</products>
<customers>
<customer>
<LastName>Winchester</LastName>
<FirstName>Sam</FirstName>
<Address>1234 Elm RD</Address>
<City>San Antonio</City>
<State>Texas</State>
<ZipCode>76345</ZipCode>
</customer>
</customers>
</PersonalData>
however, I end up with:
<PersonalData>
<products>
<product>
<productID>1</productID>
<productNumber>123456</productNumber>
<customers>
<customer>
<LastName>Winchester</LastName>
<FirstName>Sam</FirstName>
<Address>1234 Elm RD</Address>
<City>San Antonio</City>
<State>Texas</State>
<ZipCode>76345</ZipCode>
</customer>
</customers>
</product>
</products>
</PersonalData>
This is my code -button click-:
Public Sub Write_XML(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim textWriter As New XmlTextWriter(Server.MapPath("xml/PersonDataVI.xml"), Nothing)
textWriter.Formatting = System.Xml.Formatting.Indented
'Start New Document
textWriter.WriteStartDocument()
'Write a Comment
textWriter.WriteComment("This is a comment")
'Insert Start Element -root element node
textWriter.WriteStartElement("PersonalData")
'write the start element
textWriter.WriteStartElement("products")
'write the child start element
textWriter.WriteStartElement("product")
'Write ProductID Element and Data
textWriter.WriteStartElement("productID", "")
textWriter.WriteString(txtProductID.Text)
textWriter.WriteEndElement()
'Write ProductID Element and Data
textWriter.WriteStartElement("productNumber", "")
textWriter.WriteString(txtProductNum.Text)
textWriter.WriteEndElement()
'write the child element
textWriter.WriteStartElement("customers")
'write the child element
textWriter.WriteStartElement("customer")
'Write LastName Element and Data
textWriter.WriteStartElement("LastName", "")
textWriter.WriteString(txtLastName.Text)
textWriter.WriteEndElement()
'Write FirstName Element and Data
textWriter.WriteStartElement("FirstName", "")
textWriter.WriteString(txtFirstName.Text)
textWriter.WriteEndElement()
'Write Address Element and Data
textWriter.WriteStartElement("Address", "")
textWriter.WriteString(txtAddress.Text)
textWriter.WriteEndElement()
'Write City Element and Data
textWriter.WriteStartElement("City", "")
textWriter.WriteString(txtCity.Text)
textWriter.WriteEndElement()
'Write State Element and Data
textWriter.WriteStartElement("State", "")
textWriter.WriteString(txtState.Text)
textWriter.WriteEndElement()
'Write ZipCode Elment and Data
textWriter.WriteStartElement("ZipCode", "")
textWriter.WriteString(txtZipCode.Text)
textWriter.WriteEndElement()
'End Everything
textWriter.WriteEndDocument()
'Clean up
textWriter.Flush()
textWriter.Close()
'Display the XML Document
Response.Redirect(Server.MapPath("xml/PersonDataVI.xml"))
End Sub
What am I doing wrong here?
Upvotes: 1
Views: 113
Reputation: 10398
If you are using VB 9 or greater, consider using LINQ to XML rather than the explicit writer. With that you can do simply:
Dim myData = <PersonalData>
<products>
<product>
<productID>1</productID>
<productNumber>123456</productNumber>
</product>
</products>
<customers>
<customer>
<LastName>Winchester</LastName>
<FirstName>Sam</FirstName>
<Address>1234 Elm RD</Address>
<City>San Antonio</City>
<State>Texas</State>
<ZipCode>76345</ZipCode>
</customer>
</customers>
</PersonalData>
To insert values, just escape them like you would in ASP.Net:
<productID><% myProduct.ID %></productID>
Upvotes: 0
Reputation: 966
After you do the end element for product number you will need to do another two calls to end element.
Public Sub Write_XML(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim textWriter As New XmlTextWriter(Server.MapPath("xml/PersonDataVI.xml"), Nothing)
textWriter.Formatting = System.Xml.Formatting.Indented
'Start New Document
textWriter.WriteStartDocument()
'Write a Comment
textWriter.WriteComment("This is a comment")
'Insert Start Element -root element node
textWriter.WriteStartElement("PersonalData")
'write the start element
textWriter.WriteStartElement("products")
'write the child start element
textWriter.WriteStartElement("product")
'Write ProductID Element and Data
textWriter.WriteStartElement("productID", "")
textWriter.WriteString(txtProductID.Text)
textWriter.WriteEndElement()
'Write ProductID Element and Data
textWriter.WriteStartElement("productNumber", "")
textWriter.WriteString(txtProductNum.Text)
textWriter.WriteEndElement()
textWriter.WriteEndElement()
textWriter.WriteEndElement()
'write the child element
textWriter.WriteStartElement("customers")
'write the child element
textWriter.WriteStartElement("customer")
'Write LastName Element and Data
textWriter.WriteStartElement("LastName", "")
textWriter.WriteString(txtLastName.Text)
textWriter.WriteEndElement()
'Write FirstName Element and Data
textWriter.WriteStartElement("FirstName", "")
textWriter.WriteString(txtFirstName.Text)
textWriter.WriteEndElement()
'Write Address Element and Data
textWriter.WriteStartElement("Address", "")
textWriter.WriteString(txtAddress.Text)
textWriter.WriteEndElement()
'Write City Element and Data
textWriter.WriteStartElement("City", "")
textWriter.WriteString(txtCity.Text)
textWriter.WriteEndElement()
'Write State Element and Data
textWriter.WriteStartElement("State", "")
textWriter.WriteString(txtState.Text)
textWriter.WriteEndElement()
'Write ZipCode Elment and Data
textWriter.WriteStartElement("ZipCode", "")
textWriter.WriteString(txtZipCode.Text)
textWriter.WriteEndElement()
'End Everything
textWriter.WriteEndDocument()
'Clean up
textWriter.Flush()
textWriter.Close()
'Display the XML Document
Response.Redirect(Server.MapPath("xml/PersonDataVI.xml"))
End Sub
Upvotes: 0
Reputation: 3289
You are missing a WriteEndElement
for product
and products
.
After
textWriter.WriteStartElement("productNumber", "")
textWriter.WriteString(txtProductNum.Text)
textWriter.WriteEndElement()
You need two more
textWriter.WriteEndElement()
Upvotes: 2