反序列化xml Web响应时出错

时间:2011-05-17 17:51:05

标签: c# .net xml-serialization

我正在尝试使用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
}

2 个答案:

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