我正在尝试使用DataContractSerializer反序列化“SearchRecordList”类并继续获取异常:
System.InvalidOperationException: No corresponding start element is open.
我收到的XML看起来像这样:
<?xml version=\"1.0\" encoding=\"UTF-8\"?><records type=\"array\" count=\"0\"/>
奇怪的是,如果我运行测试,并传递此XML字符串:
<?xml version=\"1.0\" encoding=\"UTF-8\"?><records type=\"array\" count=\"0\"></records>
工作正常。我有什么想法我做错了吗?下面是我要反序列化的类(C#,. NET 4.0):
[XmlRoot(Namespace = "", ElementName = "records", DataType = "array")]
public class SearchRecordList:List<SearchRecord>, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
var navigator = reader.CreateNavigator(); //returns an XPathNavigator based on the reader.
var root = navigator.SelectSingleNode("records");
int count;
if (!int.TryParse(root.GetAttribute("count", ""), out count) || count < 1)
return;
navigator.MoveToFirstChild();
var n = navigator.Select("record");
AddRange(n.ToList<SearchRecord>());
}
public void WriteXml(System.Xml.XmlWriter writer)
{
throw new System.NotImplementedException();
}
#endregion
}
答案 0 :(得分:2)
在我看来,DataContractSerializer
只应用于反序列化使用DataContractSerializer
序列化的数据。它不像XmlSerializer
那样灵活。例如,DataContractSerializer
期望所有XML元素在反序列化时按字母顺序排列(请参阅此处接受的答案:WCF web service Data Members defaulting to null)。您如何保证您所呼叫的Web服务符合此要求?换句话说,DataContractSerializer
不是通用XML反序列化器,它期望数据采用非常特定的格式。 DataContractSerializer
,<records></records>
和<records />
不等同。
如果您正在使用的数据来自Web服务,您可能应该通过设置服务引用来调用Web服务。如果您不想这样做,那么我会使用XmlSerializer
。听起来DataContractSerializer
在这个例子中使用的是正确的类。
答案 1 :(得分:0)
如果XPath给你带来麻烦,你可以使用LINQ to XML。由于LINQ不是仅向前解析器,因此它可以解析文档而无需了解其结构。 http://msdn.microsoft.com/en-us/library/bb387061.aspx