Невозможно десериализовать XmlArray с пространством имен

У меня есть следующий XML:

    <MovieRunTimes>
      <ShowDate>6/9/2012</ShowDate>
      <ShowTimesByDate xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:string>12:25</a:string>
        <a:string>17:30</a:string>
        <a:string>22:35</a:string>
      </ShowTimesByDate>
      <TicketURI>http://www.fandango.com/tms.asp?t=AANCC&amp;m=112244&amp;d=2012-06-09</TicketURI>
    </MovieRunTimes>

И следующий класс С#:

public class MovieRunTimes
{
    [XmlElement("ShowDate")]
    public string ShowDate { get; set; }

    [XmlElement("TicketURI")]
    public string TicketUri { get; set; }

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

}

К сожалению, ShowTimesByDate пуст после десериализации. Если я удалю пространство имен из элемента ShowTimesByDate и префикс из строкового элемента, то он отлично десериализуется. Как правильно использовать пространство имен для десериализации XML?


person DarenMay    schedule 26.06.2012    source источник


Ответы (2)


Я обнаружил, как это сделать. Если я изменю класс на:

public class MovieRunTimes
{
    [XmlElement("ShowDate")]
    public string ShowDate { get; set; }

    [XmlElement("TicketURI")]
    public string TicketUri { get; set; }

    [XmlArray("ShowTimesByDate")]
    [XmlArrayItem(Namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
    public List<string> ShowTimesByDate { get; set; }

}

Он правильно десериализуется.

person DarenMay    schedule 26.06.2012
comment
чувак - шесть часов ломал голову над одной и той же проблемой. рыскал по MSDN и SO. Однако решение раздражает, потому что если у вас есть пространство имен для самого внешнего элемента (MoveRunTimes), то ns применяется к этому имени и элементам внутри него... поэтому вы можете подумать, что массив ns применяется к самому элементу массива, а не к его ТОЛЬКО элементы. - person mdisibio; 04.07.2012

Хитрость заключается в том, чтобы добавить префикс пространства имен ("a" в вашем случае) к элементу-оболочке Collection:

<MovieRunTimes >
  <ShowDate>6/9/2012</ShowDate>
  <a:ShowTimesByDate xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>12:25</a:string>
    <a:string>17:30</a:string>
    <a:string>22:35</a:string>
  </a:ShowTimesByDate>
  <TicketURI>http://www.fandango.com/tms.asp?t=AANCC&amp;m=112244&amp;d=2012-06-09</TicketURI>
</MovieRunTimes>

Вот как это получается после сериализации с помощью этого кода:

        XmlSerializer xs = new XmlSerializer(typeof(MovieRunTimes));
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("a", "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
        string result = null;
        using(StringWriter writer = new StringWriter())
        {
            xs.Serialize(writer,mrt,ns);
            result = writer.ToString();
        }
person Adolfo Perez    schedule 26.06.2012
comment
К сожалению, я использую XML, а не генерирую его :( - person DarenMay; 26.06.2012
comment
Если это так, вы можете либо добавить отсутствующий префикс пространства имен с помощью XSLT, либо с помощью LINQ или других библиотек XML, я думаю, до десериализации. - person Adolfo Perez; 26.06.2012