Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54

    Deserializzazione Stream SOAP

    Buongiorno a tutti

    Leggendo e rileggendo Online non riesco a capire come deserializzare uno Stream SOAP

    Questo il contenuto dello Stream SOAP che ricevo
    codice HTML:
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/><SOAP-ENV:Body>
    <inf:dettaglioVeicolo xmlns:inf="http://www.dtt.it/xsd/INFOWS">
        <inf:errore>
            <inf:codiceErrore>01</inf:codiceErrore>
            <inf:descrizioneErrore>Record assente</inf:descrizioneErrore>
        </inf:errore>
    </inf:dettaglioVeicolo>
    </SOAP-ENV:Body></SOAP-ENV:Envelope>
    Vorrei deserializzare questo codice SOAP (che dovrebbe essere XML) in una semplice struttura come faccio sempre per i file di configurazione XML...quindi:
    codice:
        Public Structure strA
            Dim ErrorType As strErr
        End Structure
    
        'Struttura Errore
        Public Structure strErr
            Dim codiceErrore As String
            Dim descrizioneErrore As String
        End Structure
    
        Private Sub DeserializeSOAP(st as stream)
            Dim ser As New XmlSerializer(GetType(strA))
            Dim A As strA = CType(ser.Deserialize(st), strA)
    Ma l'istruzione di Deserializzazione, mi va in eccezione restituendomi l'errore "Errore nel documento Xml (1, 2)"
    Avete idea di come poter deserializzare facilmente uno stream SOAP ricevuto da un WebService? Per una serie di ragioni non posso importare il servizio nel progetto.

    Grazie e Buon anno a tutti

  2. #2
    Quote Originariamente inviata da mmjc23 Visualizza il messaggio
    ...
    Grazie e Buon anno a tutti
    Ciao e buon anno anche a te.

    prova a farti generare le classi con l'utility XSD.EXE
    eseguita dal prompt dei comandi di visual studio.

    HTH

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    Quote Originariamente inviata da sspintux Visualizza il messaggio
    Ciao e buon anno anche a te.

    prova a farti generare le classi con l'utility XSD.EXE
    eseguita dal prompt dei comandi di visual studio.

    HTH
    Ciao...E grazie per avermi risposto
    Ho seguito il tuo consiglio e sono andato a spulciarmi come funziona xsd...ma, utilizzando le classi generate dal tool, il risultato non cambia "Errore nel documento Xml (1, 2)"

    Ho notato che il tool XSD, mi crea due file XSD dal file XML Error.xml: Error.xsd e Error_app1.xsd.
    Il tool XSD, mi ritorna un errore se provo a traformare in classe il primo file, mentre l'esito è positivo se traformo il secondo file.
    Comunque...utilizzando la classe generata dal secondo file, l'errore è lo stesso.

    Ho provato ad utilizzare anche il codice suggerito da Microsoft per gli stream XML SOAP, ma l'errore è lo stesso.
    codice:
    Dim myTypeMapping As XmlTypeMapping = (New SoapReflectionImporter().ImportTypeMapping(GetType(clsError)))
    Dim mySerializer As XmlSerializer = New XmlSerializer(myTypeMapping)
    Dim a As clsError = CType(mySerializer.Deserialize(st), clsError)
    Temo che mi toccherà far passare tutti i singoli tag a mano

  4. #4
    Quote Originariamente inviata da mmjc23 Visualizza il messaggio
    Ciao...E grazie per avermi risposto
    Ho seguito il tuo consiglio e sono andato a spulciarmi come funziona xsd...ma, utilizzando le classi generate dal tool, il risultato non cambia "Errore nel documento Xml (1, 2)"
    ...
    Temo che mi toccherà far passare tutti i singoli tag a mano
    estrai e deserializza solo il payload , ovvero il contenuto del soap body;
    ...una cosa del genere supponendo che il messaggio soap sia in un file
    codice:
       XmlDocument doc = new XmlDocument();
       doc.Load(@"c:\temp\soap.xml");
       XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
       nsmgr.AddNamespace("soap-env","http://schemas.xmlsoap.org/soap/envelope/");
       XmlElement ex = (XmlElement) doc.DocumentElement.SelectSingleNode("soap-env:Body", nsmgr);
    
      //e poi  vai di xmlSerializie(typeof(....))

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    Quote Originariamente inviata da sspintux Visualizza il messaggio
    estrai e deserializza solo il payload , ovvero il contenuto del soap body;
    ...una cosa del genere supponendo che il messaggio soap sia in un file
    codice:
       XmlDocument doc = new XmlDocument();
       doc.Load(@"c:\temp\soap.xml");
       XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
       nsmgr.AddNamespace("soap-env","http://schemas.xmlsoap.org/soap/envelope/");
       XmlElement ex = (XmlElement) doc.DocumentElement.SelectSingleNode("soap-env:Body", nsmgr);
    
      //e poi  vai di xmlSerializie(typeof(....))
    Ciao e grazie di nuovo per la risposta...

    Ho provato a fare come mi hai detto ma il risultato è sempre..."Errore nel documento Xml (1, 2)"

    Ecco il codice (dove dettaglioAutoveicoloComproprietariTrasferimentiRes Response è la classe restiutita dal tool xsd):
    codice:
    Dim a As New dettaglioAutoveicoloComproprietariTrasferimentiResResponse
    Dim doc As New System.Xml.XmlDocument()
    doc.Load("c:\Prova\Error.xml")
    Dim nsmgr As New System.Xml.XmlNamespaceManager(doc.NameTable)
    nsmgr.AddNamespace("soap-env", "http://schemas.xmlsoap.org/soap/envelope/")
    Dim ex As System.Xml.XmlElement = doc.DocumentElement.SelectSingleNode("soap-env:Body", nsmgr)
    Arrivato qui: ho provato ad utilizzare 3 "tipologie" di serializzazione:

    PRIMA: (restituisce "Errore nel documento Xml (1, 2)")

    codice:
    'Serialiazzatore
    Dim ser As New XmlSerializer(GetType(dettaglioAutoveicoloComproprietariTrasferimentiResResponse))
    a = CType(ser.Deserialize(New StringReader(ex.OuterXml)), dettaglioAutoveicoloComproprietariTrasferimentiResResponse)
    SECONDA: (restituisce "Errore nel documento Xml (1, 2)")
    [CODE]
    Dim myTypeMapping As XmlTypeMapping = (New SoapReflectionImporter().ImportTypeMapping(GetType (dettaglioAutoveicoloComproprietariTrasferimentiRe sResponse)))
    Dim mySerializer As XmlSerializer = New XmlSerializer(myTypeMapping)
    a = CType(mySerializer.Deserialize(New StringReader(ex.OuterXml)), dettaglioAutoveicoloComproprietariTrasferimentiRes Response)
    [CODE]

    TERZA: (L'oggetto "SoapFormatter", non accetta StringReader come parametro del metodo "Deserialize" e non so cosa passargli)
    codice:
    Dim formatter As New SoapFormatter
    a = DirectCast(formatter.Deserialize(xxxxxxx, dettaglioAutoveicoloComproprietariTrasferimentiResResponse)
    Grazie

  6. #6
    Quote Originariamente inviata da mmjc23 Visualizza il messaggio
    [/CODE]

    codice:
    'Serialiazzatore
    Dim ser As New XmlSerializer(GetType(dettaglioAutoveicoloComproprietariTrasferimentiResResponse))
    a = CType(ser.Deserialize(New StringReader(ex.OuterXml)), dettaglioAutoveicoloComproprietariTrasferimentiResResponse)
    ex.InnerXml

    P.S.
    ma hai cambiato l'xml da cui generi xsd e file di classe ?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Secondo me vi state perdendo in un bicchier d'acqua.
    Errore nel documento Xml (1, 2) significa "Errore alla riga 1, carattere 2".
    Ed è corretto.

    TUTTI i documenti XML devono iniziare con il prologo XML:

    codice:
    <?xml version"1.0" ... ?>

    Alla riga 1, carattere 2, tutti i parser si aspettano un "?", nel tuo caso trovano una "S" perchè, appunto, manca il prologo.


    Ciao.
    Ultima modifica di LeleFT; 04-01-2016 a 15:53
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Mi sono limitato a 2 considerazioni:

    1) Stai cercando di parsare quella roba la come se fosse un documento XML
    2) Quella roba la non è un XML (può essere benissimo "una parte" di un XML), poichè la specifica XML prevede il prologo.

    Poi, cosa fornisca quel web-service non lo so.
    Cosa tu ci debba fare non lo so.
    Sta di fatto che tutti i tentativi di parsing ti stanno dicendo che c'è un errore alla riga 1, carattere 2 ed il motivo te l'ho scritto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    Ok...ti ringrazio per la risposta.
    Quindi presumo che non si possa deserializzare la risposta SOAP di un WebService in una classe/struttura.

    Per scrupolo, ho provato a scrivermi un file XML con la risposta del Web Service, aggiungendo come prima linea questo:
    <?xml version="1.0" encoding="ISO-8859-1"?>

    Cercando di deserializzare questo file mediante l'oggetto "XmlSerializer" l'errore effettivamente cambia in "Errore nel documento Xml (2, 2)"

    Ho provato anche a deserializzare il file mediante l'oggetto "SoapFormatter" in questo modo:
    codice:
    Dim a As dettaglioAutoveicoloComproprietariTrasferimentiResResponse
    Dim fs As New FileStream("c:\Prova\Error.xml", FileMode.Open)
    Dim formatter As New SoapFormatter
    a = DirectCast(formatter.Deserialize(fs), dettaglioAutoveicoloComproprietariTrasferimentiResResponse)
    L'errore ritornato, in questo caso, è questo:
    "Errore di analisi: nessun assembly associato alla chiave XML inf dettaglioAutoveicoloComproprietariTrasferimentiRes Response"

  10. #10
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Mi sono limitato a 2 considerazioni:

    1) Stai cercando di parsare quella roba la come se fosse un documento XML
    2) Quella roba la non è un XML (può essere benissimo "una parte" di un XML), poichè la specifica XML prevede il prologo.

    Poi, cosa fornisca quel web-service non lo so.
    Cosa tu ci debba fare non lo so.
    Sta di fatto che tutti i tentativi di parsing ti stanno dicendo che c'è un errore alla riga 1, carattere 2 ed il motivo te l'ho scritto.


    Ciao.
    Sbaglia qualcosa lui (l'OP) perché ho provato e funziona correttamente (VS 2010).
    codice:
    ------------------------------------------------------------------------------
    ' <auto-generated>
    '     Il codice è stato generato da uno strumento.
    '     Versione runtime:4.0.30319.42000
    '
    '     Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
    '     il codice viene rigenerato.
    ' </auto-generated>
    '------------------------------------------------------------------------------
    
    
    Option Strict Off
    Option Explicit On
    
    Imports System.Xml.Serialization
    
    '
    'Codice sorgente generato automaticamente da xsd, versione=4.0.30319.1.
    '
    
    '''<remarks/>
    <System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1"),  _
     System.SerializableAttribute(),  _
     System.Diagnostics.DebuggerStepThroughAttribute(),  _
     System.ComponentModel.DesignerCategoryAttribute("code"),  _
     System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true, [Namespace]:="http://www.dtt.it/xsd/INFOWS"),  _
     System.Xml.Serialization.XmlRootAttribute([Namespace]:="http://www.dtt.it/xsd/INFOWS", IsNullable:=false)>  _
    Partial Public Class dettaglioAutoveicoloComproprietariTrasferimentiResResponse
        
        Private erroreField() As dettaglioAutoveicoloComproprietariTrasferimentiResResponseErrore
        
        '''<remarks/>
        <System.Xml.Serialization.XmlElementAttribute("errore")>  _
        Public Property errore() As dettaglioAutoveicoloComproprietariTrasferimentiResResponseErrore()
            Get
                Return Me.erroreField
            End Get
            Set
                Me.erroreField = value
            End Set
        End Property
    End Class
    
    
    '''<remarks/>
    <System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1"),  _
     System.SerializableAttribute(),  _
     System.Diagnostics.DebuggerStepThroughAttribute(),  _
     System.ComponentModel.DesignerCategoryAttribute("code"),  _
     System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true, [Namespace]:="http://www.dtt.it/xsd/INFOWS")>  _
    Partial Public Class dettaglioAutoveicoloComproprietariTrasferimentiResResponseErrore
        
        Private codiceErroreField As String
        
        Private descrizioneErroreField As String
        
        '''<remarks/>
        Public Property codiceErrore() As String
            Get
                Return Me.codiceErroreField
            End Get
            Set
                Me.codiceErroreField = value
            End Set
        End Property
        
        '''<remarks/>
        Public Property descrizioneErrore() As String
            Get
                Return Me.descrizioneErroreField
            End Get
            Set
                Me.descrizioneErroreField = value
            End Set
        End Property
    End Class


    codice di prova
    codice:
    Imports System.IO
    Imports System.Xml.Serialization
    
    
    Public Class Form1
    
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
    
            'Dim a As New dettaglioAutoveicoloComproprietariTrasferimentiResResponse non serve nessun new
            Dim a As dettaglioAutoveicoloComproprietariTrasferimentiResResponse
    
    
            Dim doc As New System.Xml.XmlDocument()
            doc.Load("c:\temp\Error.xml")
            Dim nsmgr As New System.Xml.XmlNamespaceManager(doc.NameTable)
            nsmgr.AddNamespace("soap-env", "http://schemas.xmlsoap.org/soap/envelope/")
            Dim ex As System.Xml.XmlElement = doc.DocumentElement.SelectSingleNode("soap-env:Body", nsmgr)
            'Serialiazzatore
            Dim ser As New XmlSerializer(GetType(dettaglioAutoveicoloComproprietariTrasferimentiResResponse))
            a = CType(ser.Deserialize(New StringReader(ex.InnerXml)), dettaglioAutoveicoloComproprietariTrasferimentiResResponse)
    
    
            MessageBox.Show(a.errore(0).codiceErrore & " - " & a.errore(0).descrizioneErrore)
    
    
    
    
    
    
        End Sub
    End Class
    Ultima modifica di sspintux; 04-01-2016 a 16:45

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.