0

I have a Web service, which returns the Response in XML. I am getting an error while reading the response if the response have empty fields.

I have tried different code for XML deserialization, but none of them is working.

I have below deserialization code written. I have tried this one and it was throwing server connection closed after receiving the response. Not sure what could be the issue please help me as early as possible.

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class T_OUTPUTItem
{

    [XmlElement("BUKRS")]
    public ushort BUKRS { get; set; }
    [XmlElement("WERKS")]
    public ushort WERKS { get; set; }
    [XmlElement("NAME1")]
    public string NAME1 { get; set; }
    [XmlElement("REGIO")]
    public string REGIO { get; set; }
    [XmlElement("MATKL")]
    public string MATKL { get; set; }
    [XmlElement("MATNR")]
    public ushort MATNR { get; set; }
    [XmlElement("LGORT")]
    public string LGORT { get; set; }
    [XmlElement("GRDIP")]
    public double? GRDIP {get; set;}
    [XmlElement("TRNDATE")]
    public System.DateTime TRNDATE { get; set; }
    [XmlElement("VOL_NATURAL")]
    public double? VOL_NATURAL
    {
        get
        {
            if (VOL_NATURAL == 0)
            {
                return 0;
            }
            else return VOL_NATURAL;
        }
    }

    [XmlElement("GRDIP_RUN")]
    public double? GRDIP_RUN
    {
        get
        {
            if (GRDIP_RUN == 0)
            {
                return 0;
            }
            else return GRDIP_RUN;
        }
    }
    [XmlElement("VOL_RUNNING")]
    public double? VOL_RUNNING
    {
        get
        {
            if (VOL_RUNNING == 0)
            {
                return 0;
            }
            else return VOL_RUNNING;
        }
    }

}

}

The above code worked when there no empty tag for GRDIP, if there is any empty tag returning for GRDIP it was throwing an error. So i have tried GRDIP code as the same like VOL_running but still it was throwing an error.

Please help me in resolving the issue.

The Response looks like below

<ns0:YV_PIPELINE_PLANT_DIP_DETAILS.Response xmlns:ns0="urn:sap-com:document:sap:rfc:functions">
    <E_MSG/>
    <T_OUTPUT>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-MS</MATKL>
            <MATNR>16400</MATNR>
            <LGORT>PIPE</LGORT>
            <GRDIP/>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>208.375</VOL_NATURAL>
            <GRDIP_RUN/>
            <VOL_RUNNING/>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-MS</MATKL>
            <MATNR>16400</MATNR>
            <LGORT>T005</LGORT>
            <GRDIP>0212.8</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>454.573</VOL_NATURAL>
            <GRDIP_RUN>0825.5</GRDIP_RUN>
            <VOL_RUNNING>1686.183</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-MS</MATKL>
            <MATNR>16400</MATNR>
            <LGORT>T006</LGORT>
            <GRDIP>0188.0</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>844.502</VOL_NATURAL>
            <GRDIP_RUN>0611.1</GRDIP_RUN>
            <VOL_RUNNING>2756.545</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-MS</MATKL>
            <MATNR>16400</MATNR>
            <LGORT>T007</LGORT>
            <GRDIP>157.2</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>699.171</VOL_NATURAL>
            <GRDIP_RUN>0159.3</GRDIP_RUN>
            <VOL_RUNNING>708.663</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-MS</MATKL>
            <MATNR>16403</MATNR>
            <LGORT>PIPE</LGORT>
            <GRDIP/>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>0</VOL_NATURAL>
            <GRDIP_RUN/>
            <VOL_RUNNING/>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-SKO</MATKL>
            <MATNR>40000</MATNR>
            <LGORT>PIPE</LGORT>
            <GRDIP/>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>99.572</VOL_NATURAL>
            <GRDIP_RUN/>
            <VOL_RUNNING/>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-SKO</MATKL>
            <MATNR>40000</MATNR>
            <LGORT>T010</LGORT>
            <GRDIP>1427.9</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>2190.395</VOL_NATURAL>
            <GRDIP_RUN>1606.9</GRDIP_RUN>
            <VOL_RUNNING>2464.582</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-SKO</MATKL>
            <MATNR>40000</MATNR>
            <LGORT>T011</LGORT>
            <GRDIP>0283.3</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>435.725</VOL_NATURAL>
            <GRDIP_RUN>1026.0</GRDIP_RUN>
            <VOL_RUNNING>1578.163</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-HSD</MATKL>
            <MATNR>56000</MATNR>
            <LGORT>T001</LGORT>
            <GRDIP>1574.9</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>8354.031</VOL_NATURAL>
            <GRDIP_RUN>1819.4</GRDIP_RUN>
            <VOL_RUNNING>9649.826</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>2200</BUKRS>
            <WERKS>2222</WERKS>
            <NAME1>IOCL,JHARSUGUDA TERMINAL</NAME1>
            <REGIO>OR</REGIO>
            <MATKL>BULK-HSD</MATKL>
            <MATNR>56000</MATNR>
            <LGORT>T002</LGORT>
            <GRDIP>334.2</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>1770.146</VOL_NATURAL>
            <GRDIP_RUN>1819.5</GRDIP_RUN>
            <VOL_RUNNING>9649.669</VOL_RUNNING>
        </item>
        <item>
            <BUKRS>3300</BUKRS>
            <WERKS>3384</WERKS>
            <NAME1>IOT INFRASTRUCTURE &amp; ENERGY SE</NAME1>
            <REGIO>CSG</REGIO>
            <MATKL>BULK-HSD</MATKL>
            <MATNR>56000</MATNR>
            <LGORT>T01D</LGORT>
            <GRDIP>222.8</GRDIP>
            <TRNDATE>2019-09-01</TRNDATE>
            <VOL_NATURAL>16610.006</VOL_NATURAL>
            <GRDIP_RUN/>
            <VOL_RUNNING/>
        </item>
    </T_OUTPUT>
</ns0:YV_PIPELINE_PLANT_DIP_DETAILS.Response>
Dharman
  • 30,962
  • 25
  • 85
  • 135
  • Looks like you have an infinite recursion in the get methods for `VOL_NATURAL`, `GRDIP_RUN` and `VOL_RUNNING`. Also `XmlSerializer` only serializes (non-collection) properties with public get and set methods. – dbc Sep 09 '19 at 07:41
  • 1
    Also, you can't deserialize an empty element into a nullable value type. You need to use a surrogate string property instead. See: [Deserializing empty xml attribute value into nullable int property using XmlSerializer](https://stackoverflow.com/a/1479195). – dbc Sep 09 '19 at 08:12

1 Answers1

0

Try following :

        private double? _GRDIP { get; set; }
        [XmlElement("GRDIP")]
        public string GRDIP {
            get { return _GRDIP.ToString(); }
            set { _GRDIP = (value == string.Empty) ? null : (double?)double.Parse(value);}
        }
jdweng
  • 33,250
  • 2
  • 15
  • 20
  • I'd recommend using [`XmlConvert.ToDouble()`](https://learn.microsoft.com/en-us/dotnet/api/system.xml.xmlconvert.todouble?view=netframework-4.8#System_Xml_XmlConvert_ToDouble_System_String_) and [`XmlConvert.ToString()`](https://learn.microsoft.com/en-us/dotnet/api/system.xml.xmlconvert.tostring?view=netframework-4.8) to ensure the double is correctly internationalized. – dbc Sep 09 '19 at 20:51