user1724708
user1724708

Reputation: 1469

XML output is incorrect

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

Answers (3)

Jim Wooley
Jim Wooley

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

David MacCrimmon
David MacCrimmon

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

Garrison Neely
Garrison Neely

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

Related Questions