Десериализовать XML с массивом в настраиваемом пространстве имен - PullRequest
0 голосов
/ 17 июня 2020

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

<ErrorResponse xmlns="http://schemas.ipcommerce.com/CWS/v2.0/Rest" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ErrorId>7002</ErrorId>
    <HelpUrl>http://docs.nabvelocity.com/hc/en-us/articles/203497757-REST-Information</HelpUrl>
    <Messages xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:string>An invalid security token was provided.</a:string>
    </Messages>
    <Operation>SignOn</Operation>
    <Reason i:nil="true"/>
    <ValidationErrors/>
</ErrorResponse>

в такой объект с помощью его stati c метода

  [XmlRoot("ErrorResponse", Namespace = "http://schemas.ipcommerce.com/CWS/v2.0/Rest")]
  public class VelocityException
  {
    public int ErrorId { get; set; }
    public string Operation { get; set; }

    [XmlArray("Messages", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
    public string[] Messages { get; set; }

    public static VelocityException FromXmlString(string xml)
    {
      XmlSerializer serializer = new XmlSerializer(typeof(VelocityException), );
      return (VelocityException)serializer.Deserialize(new StringReader(xml));
    }
  }

однако после десериализации массив Сообщения всегда нулевые. Как настроить префикс пользовательского пространства имен для десериализации этого массива строк?

1 Ответ

1 голос
/ 17 июня 2020

Вместо XmlArray используйте XmlArrayItem. Кроме того, удалите «Сообщения» и используйте вместо них «строку», поскольку ваши Сообщения представляют собой список «строки» (a: string)

Это работает,

[XmlRoot("ErrorResponse", Namespace = "http://schemas.ipcommerce.com/CWS/v2.0/Rest")]
public class VelocityException
{
    public int ErrorId { get; set; }
    public string Operation { get; set; }

    [XmlArrayItem("string", Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays", IsNullable = false)]
    public string[] Messages { get; set; }

    public static VelocityException FromXmlString(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(VelocityException));
        return (VelocityException)serializer.Deserialize(new StringReader(xml));
    }
}
...