Десериализовать XML со списком элементов, некоторые из которых xsi: nil = «true» - PullRequest
0 голосов
/ 15 марта 2019

Когда я десериализирую приведенный ниже XML от стороннего производителя, мои объекты всегда имеют значение null.

XML

<?xml version="1.0"?>
<OrderImport xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Reply i:nil="true">
  </Reply>
  <ReplyStatus i:nil="true">
    <DebugInfo>
    </DebugInfo>
    <PerformanceLogInfo>
    </PerformanceLogInfo>
  </ReplyStatus>
  <Reply>
    <OrderNumber>4063286</OrderNumber>
  </Reply>
  <ReplyStatus>
    <Result>0</Result>
    <Message>
    </Message>
  </ReplyStatus>
</OrderImport>

C # Class

[XmlRoot(ElementName = "OrderImport")]
public class OrderImport
{
    [XmlElement(ElementName = "Reply")]
    public List<Reply> Reply { get; set; }
    [XmlElement(ElementName = "ReplyStatus")]
    public List<ReplyStatus> ReplyStatus { get; set; }
    [XmlAttribute(AttributeName = "i", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string I { get; set; }
}

[XmlRoot(ElementName= "Reply")]
public class Reply
{
    [XmlAttribute(AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Nil { get; set; }
    [XmlElement(ElementName = "OrderNumber")]
    public string OrderNumber { get; set; }
}

[XmlRoot(ElementName = "ReplyStatus")]
public class ReplyStatus
{
    [XmlElement(ElementName = "DebugInfo")]
    public string DebugInfo { get; set; }
    [XmlElement(ElementName = "PerformanceLogInfo")]
    public string PerformanceLogInfo { get; set; }
    [XmlAttribute(AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Nil { get; set; }
    [XmlElement(ElementName = "Result")]
    public string Result { get; set; }
    [XmlElement(ElementName = "Message")]
    public string Message { get; set; }
}

Я полагаю, что проблема связана с первым появлением объектов Reply и ReplyStatus, имеющих нулевое значение.

Я пытаюсь десериализовать, как это так

httpResponseMessage.Content.ReadAsAsync<OrderImport>().Result;

Тем не менее, я обнаружил, что если я десериализирую, как это, это работает просто отлично

stringres = httpResponseMessage.Content.ReadAsStringAsync().Result;
using (var stringreader = new StringReader(stringres))
                {
                    var result = (OrderImport)xmlSerializer.Deserialize(stringreader);

                }
...