Search code examples
c#xmlxml-deserialization

C# deserialization CBISDDStsRptPhyMsg


I need to deserialize a XML that follows the CBI Italian standard, the problem is that I've already marked every class with the namespace's but I'm still unable to deserialize.

This is part of the xml that I'm trying to deserialize (content erased):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RISPOSTASDD:CBISDDStsRptPhyMsg xmlns:HE2E="urn:CBI:xsd:CBIHdrSrv.001.07" xmlns:BODY="urn:CBI:xsd:CBIBdySDDStsRpt.00.01.00" xmlns:SGNT="urn:CBI:xsd:CBISgnInf.001.04" xmlns:RISPOSTASDD="urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00" xmlns:LMSG="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00" xmlns:HTRT="urn:CBI:xsd:CBIHdrTrt.001.07">
    <RISPOSTASDD:CBIHdrTrt>
        <HTRT:IdCBISndrf></HTRT:IdCBISndrf>
        <HTRT:IdCBIRcvrf></HTRT:IdCBIRcvrf>
        <HTRT:SrvNm></HTRT:SrvNm>
        <HTRT:IdMsgTrt></HTRT:IdMsgTrt>
        <HTRT:XMLCrtDt></HTRT:XMLCrtDt>
        <HTRT:RtrnAddrl></HTRT:RtrnAddrl>
    </RISPOSTASDD:CBIHdrTrt>
    <RISPOSTASDD:CBIHdrSrv>
        <HE2E:SrvInfo>
            <HE2E:SrvNm></HE2E:SrvNm>
            <HE2E:IdE2EMsg></HE2E:IdE2EMsg>
            <HE2E:XMLCrtDt></HE2E:XMLCrtDt>
        </HE2E:SrvInfo>
        <HE2E:Sender>
            <HE2E:IdCBISend></HE2E:IdCBISend>
            <HE2E:SendTyp></HE2E:SendTyp>
            <HE2E:CBIRefrSend></HE2E:CBIRefrSend>
        </HE2E:Sender>
        <HE2E:Receiver>
            <HE2E:IdCBIRecv></HE2E:IdCBIRecv>
            <HE2E:RecvTyp></HE2E:RecvTyp>
            <HE2E:CBIRefrRecv></HE2E:CBIRefrRecv>
        </HE2E:Receiver>
        <HE2E:DiagInfo>
            <HE2E:UsrBnk></HE2E:UsrBnk>
            <HE2E:DiagVers></HE2E:DiagVers>
            <HE2E:ChkSbj></HE2E:ChkSbj>
            <HE2E:ChkDt></HE2E:ChkDt>
        </HE2E:DiagInfo>
        <HE2E:CongrInfo>
            <HE2E:SrvBdyNb></HE2E:SrvBdyNb>
        </HE2E:CongrInfo>
    </RISPOSTASDD:CBIHdrSrv>
    <RISPOSTASDD:CBIBdySDDStsRpt>
        <BODY:PhyMsgInf>
            <BODY:PhyMsgTpCd></BODY:PhyMsgTpCd>
            <BODY:NbOfLogMsg></BODY:NbOfLogMsg>
        </BODY:PhyMsgInf>
        <BODY:CBIEnvelSDDStsRptLogMsg>
            <BODY:CBISDDStsRptLogMsg>...

And these are (some) the classes that I've wrote to deserialize it:

[Serializable, XmlRoot(Namespace = "urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00")]
public class CBISDDStsRptPhyMsg
{
    [XmlElement("CBIHdrTrt", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public CBIHdrTrt CBIHdrTrt {get;set;}
    [XmlElement("CBIHdrSrv", Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public CBIHdrSrv CBIHdrSrv {get;set;}
    [XmlElement("CBIBdySDDStsRpt", Namespace="urn:CBI:xsd:CBIBdySDDStsRpt.00.01.00")]
    public CBIBdySDDStsRpt CBIBdySDDStsRpt { get; set; }
}
[Serializable]
public class CBIHdrTrt
{
    [XmlElement("IdCBISndrf", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public string IdCBISndrf { get; set; }
    [XmlElement("IdCBIRcvrf", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public string IdCBIRcvrf { get; set; }
    [XmlElement("SrvNm", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public string SrvNm { get; set; }
    [XmlElement("IdMsgTrt", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public string IdMsgTrt { get; set; }
    [XmlElement("XMLCrtDt", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public DateTime XMLCrtDt { get; set; }
    [XmlElement("RtrnAddrl", Namespace = "urn:CBI:xsd:CBIHdrTrt.001.07")]
    public string RtrnAddrl { get; set; }
}
[Serializable]
public class CBIHdrSrv
{
    [XmlElement("SrvInfo",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public SrvInfo SrvInfo { get; set; }
    [XmlElement("Sender",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public Sender Sender { get; set; }
    [XmlElement("Receiver",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public Receiver Receiver { get; set; }
    [XmlElement("DiagInfo",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public DiagInfo DiagInfo { get; set; }
    [XmlElement("CongrInfo",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public CongrInfo CongrInfo { get; set; }
}

[Serializable]
public class SrvInfo
{
    [XmlElement("SrvNm",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string SrvNm { get; set; }
    [XmlElement("IdE2EMsg",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string IdE2EMsg { get; set; }
    [XmlElement("XMLCrtDt",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public DateTime XMLCrtDt { get; set; }
}

[Serializable]
public class Sender
{
    [XmlElement("IdCBISend",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string IdCBISend { get; set; }
    [XmlElement("SendTyp",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string SendTyp { get; set; }
    [XmlElement("CBIRefrSend",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string CBIRefrSend { get; set; }
}

[Serializable]
public class Receiver
{
    [XmlElement("IdCBIRecv",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string IdCBIRecv { get; set; }
    [XmlElement("RecvTyp",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string RecvTyp { get; set; }
    [XmlElement("CBIRefrRecv",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string CBIRefrRecv { get; set; }
}

[Serializable]
public class DiagInfo
{
    [XmlElement("UsrBnk",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string UsrBnk { get; set; }
    [XmlElement("DiagVers",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string DiagVers { get; set; }
    [XmlElement("ChkSbj",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public string ChkSbj { get; set; }
    [XmlElement("ChkDt",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public DateTime ChkDt { get; set; }
}

[Serializable]
public class CongrInfo
{
    [XmlElement("SrvBdyNb",Namespace="urn:CBI:xsd:CBIHdrSrv.001.07")]
    public int SrvBdyNb { get; set; }
}
[Serializable]
public class CBIBdySDDStsRpt
{
    [XmlElement("PhyMsgInf", Namespace = "urn:CBI:xsd:CBIBdySDDStsRpt.00.01.00")]
    public PhyMsgInf PhyMsgInf { get; set; }
    [XmlElement("CBIEnvelSDDStsRptLogMsg", Namespace = "urn:CBI:xsd:CBIBdySDDStsRpt.00.01.00")]
    public CBIEnvelSDDStsRptLogMsg CBIEnvelSDDStsRptLogMsg { get; set; }
}

[Serializable]
public class CBIEnvelSDDStsRptLogMsg
{
    [XmlElement("CBISDDStsRptLogMsg", Namespace = "urn:CBI:xsd:CBIBdySDDStsRpt.00.01.00")]
    public CBISDDStsRptLogMsg CBISDDStsRptLogMsg { get; set; }
}

[Serializable]
public class CBISDDStsRptLogMsg
{
    [XmlElement("GrpHdr", Namespace = "urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00")]
    public GroupHeader GroupHeader { get; set; }
    [XmlElement("OrgnlGrpInfAndSts", Namespace = "urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00")]
    public OriginalGroupInformationAndStatus OriginalGroupInformationAndStatus { get; set; }
    [XmlElement("OrgnlPmtInfAndSts", Namespace = "urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00")]
    public List<OriginalPaymentInformationAndStatus> OriginalPaymentInformationAndStatus { get; set; }
}

My deserialization is pretty simple:

                var sITA = new XmlSerializer(typeof(CBISDDStsRptPhyMsg));
                var xmlITA = new CBISDDStsRptPhyMsg();
                using(var reader = XmlReader.Create(fileInput.InputStream))
                {
                    xmlITA = (CBISDDStsRptPhyMsg)sITA.Deserialize(reader);
                }

and at the end of it, all of my 3 main objects are null.

Does anyone have a clue on what I'm doing wrong? I've already managed to serialize/deserialize every SEPA files (pain.00x) that I've found but this Italian standard is giving me quite some head-aches for a while.

Does anyone have the classes that are able to deserialize this italian standard? (Don't bother on finding the .xsd to generate it because I've already googled quite a bit and the .xsd is nowhere to be found!)

Thanks in advance.


Solution

  • The three child elements of the root element in the same namespace as the root, the one prefixed RISPOSTASDD:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <RISPOSTASDD:CBISDDStsRptPhyMsg xmlns:HE2E="urn:CBI:xsd:CBIHdrSrv.001.07" xmlns:BODY="urn:CBI:xsd:CBIBdySDDStsRpt.00.01.00" xmlns:SGNT="urn:CBI:xsd:CBISgnInf.001.04" xmlns:RISPOSTASDD="urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00" xmlns:LMSG="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00" xmlns:HTRT="urn:CBI:xsd:CBIHdrTrt.001.07">
        <RISPOSTASDD:CBIHdrTrt>
            <!-- Nested elements snipped -->
        </RISPOSTASDD:CBIHdrTrt>
        <RISPOSTASDD:CBIHdrSrv>
            <!-- Nested elements snipped -->
        </RISPOSTASDD:CBIHdrSrv>
        <RISPOSTASDD:CBIBdySDDStsRpt>
            <!-- Remaining XML not included in the question -->
    

    Thus your root class needs to be modified as follows:

    [Serializable, XmlRoot(Namespace = "urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00")]
    public class CBISDDStsRptPhyMsg
    {
        [XmlElement("CBIHdrTrt", Namespace = "urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00")]
        public CBIHdrTrt CBIHdrTrt { get; set; }
        [XmlElement("CBIHdrSrv", Namespace = "urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00")]
        public CBIHdrSrv CBIHdrSrv { get; set; }
        [XmlElement("CBIBdySDDStsRpt", Namespace = "urn:CBI:xsd:CBISDDStsRptPhyMsg.00.01.00")]
        public CBIBdySDDStsRpt CBIBdySDDStsRpt { get; set; }
    }
    

    (Or you could just omit the Namespace = on the properties since it's the same as in the XmlRoot attribute.)

    There may be other problems, but your question doesn't contain a full mcve (the XML and classes are both incomplete) but at the minimum this looks incorrect.