Solved

Desearialize an XML string

Posted on 2013-06-04
4
921 Views
Last Modified: 2013-06-05
I have a windows service built with VS 2012 vb.net 4.0

I want to desterilize this xml string:

<?xml version='1.0' encoding='UTF-8'?>
<response>
    <result numFound="96">
        <doc spendingCategory="Assistance">
            <record_count>2</record_count>
            <UniqueTransactionID>747cd6362dcfa5a2c1b2e49823b3fb5c</UniqueTransactionID>        </doc>
        <doc spendingCategory="Assistance">
            <record_count>3</record_count>
            <UniqueTransactionID>6dfae83f273289b0185ba25a821f7e27</UniqueTransactionID>        </doc>
        <doc spendingCategory="Assistance">
            <record_count>4</record_count>
            <UniqueTransactionID>3c713f5add6cc3b40042609a7ae5262c</UniqueTransactionID>        </doc>
    </result>
</response>


Into this structure:

Public Structure response
        Dim result As result
    End Structure
    Public Structure result
        Dim numFound As String
        Dim doc() As doc
    End Structure
    Public Structure doc
        Dim spendingCategory As String
        Dim record_count As String
        Dim UniqueTransactionID As String
    End Structure

using this code:


    Public Shared Sub DeSerialize_Response(ByVal sXML As String, ByRef oResponse As response)

        If String.IsNullOrEmpty(sXML) Then
            oResponse = Nothing
            Exit Sub
        End If

        Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Schedule))
        Dim settings As New XmlReaderSettings()

        Using textReader As New StringReader(sXML)
            Using xmlReader__1 As XmlReader = XmlReader.Create(textReader, settings)
                oResponse = DirectCast(serializer.Deserialize(xmlReader__1), response)
            End Using
        End Using

    End Sub


I am getting this error:

{"There is an error in XML document (2, 2)."}  and this in innerEXCEPTION:

<response xmlns=''> was not expected.

Can you tell me what i'm doing wrong with either my structure or my code.
thanks.
0
Comment
Question by:cnxmax
  • 2
  • 2
4 Comments
 
LVL 37

Expert Comment

by:TommySzalapski
ID: 39220625
It has to do with the response element being the root. It is expecting you to give a namespace (the ns is for namespace). So it is complaining because the namespace is blank (xmlns = '') note that it is two ' characters not one " character.

Did you not create the file with the same VB library? It should have put a namespace in there.

You can give it a blank namespace when you serialize, something like this (trying to translate from C# in my head).
Dim ns As New XmlSerializerNamespaces ns
ns.Add("", "")

serializer.Serialize(writer, object, ns)

Open in new window


Or you could add some attributes to your structure like
<XmlRoot("response")> _
Public Structure response
'... rest of code

Open in new window

0
 

Author Comment

by:cnxmax
ID: 39222899
TommySzalapski,  thanks for responding.   I have made progress using your suggestions.   they error messages are now gone.  however, after deserialization my oResponse.result.doc object has a count of 0 and my numFound is "nothing".

This is what I am now using for the structure:


    <XmlRoot("response")>
    Public Structure response
        Dim result As result
    End Structure
    Public Structure result
        Dim numFound As String
        <XmlArray>
        <XmlArrayItem("doc")>
        Dim doc As List(Of doc)
    End Structure

The xml string is the same.

This is the code I am now using for deserialization :


    Public Shared Sub DeSerialize_Response(ByVal sXML As String, ByRef oResponse As response)

        If String.IsNullOrEmpty(sXML) Then
            oResponse = Nothing
            Exit Sub
        End If

        Dim serializer As New Xml.Serialization.XmlSerializer(GetType(response), New XmlRootAttribute("response"))
        Dim settings As New XmlReaderSettings()

        Using textReader As New StringReader(sXML)
            Using xmlReader__1 As XmlReader = XmlReader.Create(textReader, settings)
                oResponse = DirectCast(serializer.Deserialize(xmlReader__1), response)
            End Using
        End Using

    End Sub

can you see why  my oResponse.result.doc object has a count of 0 and my numFound is "nothing"
0
 
LVL 37

Accepted Solution

by:
TommySzalapski earned 500 total points
ID: 39222926
If the original problem is gone, then your best bet would be to close this question (since it was answered) and open a new one for the new problem. That way other people will look at it besides just me and it will have a better chance at a good fast answer.

I don't see anything right away that would explain why it's not working, but I don't have Windows on this computer so I can't play with .net code. I can try to look at it later when I get home, but again, since the original issue was solved, it makes sense to ask this as a new question. If you use the misc programming zone again, I will see the question in my email and it will remind me to look at it.
0
 

Author Closing Comment

by:cnxmax
ID: 39223054
did what you said, worked like a charm
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This is an explanation of a simple data model to help parse a JSON feed
This article will inform Clients about common and important expectations from the freelancers (Experts) who are looking at your Gig.
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…

805 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question