如何反序列化肥皂反应?

时间:2018-02-07 10:24:26

标签: c# xml wcf soap xml-deserialization

我正在尝试将xml反序列化为c#object:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
  <ns2:topupResponse xmlns:ns2="http://www.claro.com.hn/esb/ws/topups/" 
 xmlns:ns3="http://www.claro.com.hn/esb/ws/ops/">
     <result>
        <conversionRate>7.7765</conversionRate>
        <datetime>2018-01-10T08:33:19.685-06:00</datetime>
        <distAmount>5.00</distAmount>
        <msisdn>50279613880</msisdn>
        <newBalance>38</newBalance>
        <operAmount>38.882500</operAmount>
        <responseCode>0</responseCode>
        <transId>228855</transId>
     </result>
  </ns2:topupResponse>

我已经设置了这样的课程:

[XmlRoot("Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
public class Response
{
    public ResponseBody Body { get; set; }
}

public class ResponseBody
{
    [XmlElement(ElementName = "topupResponse", Namespace = "http://www.claro.com.hn/esb/ws/topups/, http://www.claro.com.hn/esb/ws/ops/")]
    public TopupResponse topupResponse { get; set; }
}

public class TopupResponse
{
    public Result result { get; set; }
}

public class Result
{
    public string conversionRate { get; set; }
    public string datetime { get; set; }
    public string distAmount { get; set; }
    public string msisdn { get; set; }
    public string newBalance { get; set; }
    public string operAmount { get; set; }
    public string responseCode { get; set; }
    public string transId { get; set; }
}

我正在使用以下方法反序列化:

  private static object XmlDeserializeFromString(string objectData, Type type)
    {
        objectData = RemoveInvalidXmlCharacters(objectData);//customizeoption if you know the xml you receive wont have any invalid characters you can remove this function

        var serializer = new XmlSerializer(type);
        object result;
        using (var reader = new StringReader(objectData))
        {
            result = serializer.Deserialize(reader);
        }
        return result;
    }

但是我没有在我的对象中获得结果值。它只反序列化到TopupResonse并且为null。我尝试了一下谷歌,但找不到任何具体的东西。我认为,问题在于命名空间,并不完全确定。任何帮助将非常感激。

3 个答案:

答案 0 :(得分:3)

我必须按如下方式更新两个类:

 public class TopupResponse
{
    [XmlElement(Namespace = "")]
    public Result result { get; set; }
}

public class Result
{
    [XmlElement(Namespace = "")]
    public string conversionRate { get; set; }

    [XmlElement(Namespace = "")]
    public string datetime { get; set; }

    [XmlElement(Namespace = "")]
    public string distAmount { get; set; }

    [XmlElement(Namespace = "")]
    public string msisdn { get; set; }

    [XmlElement(Namespace = "")]
    public string newBalance { get; set; }

    [XmlElement(Namespace = "")]
    public string operAmount { get; set; }

    [XmlElement(Namespace = "")]
    public string responseCode { get; set; }

    [XmlElement(Namespace = "")]
    public string transId { get; set; }
}

向结果类添加空命名空间解决了这个问题。分享,以防有人发现它有用。

答案 1 :(得分:0)

或者,我们可以使用Visual Studio的Paste Special功能从xml或json创建c#类,这非常简单有效。

答案 2 :(得分:0)

私有静态对象XmlDeserializeFromString(string objectData,Type type) { objectData = RemoveInvalidXmlCharacters(objectData); // customizeoption,如果您知道收到的xml不会包含任何无效字符,则可以删除此功能

    var serializer = new XmlSerializer(type);
    object result;
    using (var reader = new StringReader(objectData))
    {
        result = serializer.Deserialize(reader);
    }
    return result;
}

我能知道您在上述函数中使用的类型是什么吗?您通过了什么打字?我相信Objectdata是xml。