C# 无法使用命名空间反序列化XmlArray
我有以下XML: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
<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&m=112244&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&m=112244&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&m=112244&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将应用于数组元素本身,而不仅仅是其元素。