C# 无法使用命名空间反序列化XmlArray

C# 无法使用命名空间反序列化XmlArray,c#,xml-serialization,xml-deserialization,C#,Xml Serialization,Xml Deserialization,我有以下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&g

我有以下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>
以及以下C类:

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元素中删除名称空间,并从string元素中删除前缀,那么它可以反序列化。如何正确使用名称空间来反序列化XML?

诀窍是在您的案例中向集合包装器元素添加名称空间前缀a:

<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>

诀窍是在您的案例中将名称空间前缀a添加到集合包装器元素:

<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>

我发现了如何做到这一点。如果我将课程修改为:

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; }

}

它反序列化正确。

我发现了如何实现这一点。如果我将课程修改为:

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; }

}

它反序列化正确。

不幸的是,我正在使用XML,而不是生成它:如果是这种情况,您可以在反序列化之前使用XSLT或LINQ或其他XML库添加缺少的名称空间preffix。不幸的是,我正在使用XML,不生成它:如果是这样的话,您可以使用XSLT或LINQ或其他XML库添加缺少的名称空间preffix,我猜在反序列化之前..dude-在同样的问题上敲了我六个小时的脑袋。搜索MSDN等等。不过,这个解决方案令人恼火,因为如果你有最外层元素MoveRunTimes的名称空间,那么ns将应用于该名称和其中的元素……因此你会认为数组ns将应用于数组元素本身,而不仅仅是它的元素。dude-在同一个问题上敲了我六个小时的脑袋。搜索MSDN等等。不过,这个解决方案令人恼火,因为如果您为最外层的元素MoveRunTimes设置了名称空间,那么ns将应用于该名称以及其中的元素……因此您会认为数组ns将应用于数组元素本身,而不仅仅是其元素。