XMLSerializer不反序列化XML

时间:2013-11-22 16:44:46

标签: c# xml xsd xml-serialization

我在尝试反序列化xml时收到以下错误。这会产生错误:

XmlSerializer serializer = new XmlSerializer(typeof(PrivateOptionsAPIResponse));
var result = serializer.Deserialize(streamReader);

例外:

发现了System.InvalidOperationException 消息= XML文档(0,0)中存在错误 InnerException:System.Xml.XmlException
消息=缺少根元素
源=的System.Xml

我不确定如何纠正这个问题。请求返回以下XML:

<PrivateOptionsAPIResponse> <CountiesForPostalCodeResponse> <Counties> <County> <CountyName>PRINCE WILLIAM</CountyName> <StateCode>VA</StateCode> </County> <County> <CountyName>MANASSAS CITY</CountyName> <StateCode>VA</StateCode> </County> <County> <CountyName>MANASSAS PARK CITY</CountyName> <StateCode>VA</StateCode> </County> </Counties> </CountiesForPostalCodeResponse> </PrivateOptionsAPIResponse>

我使用xsd.exe生成一个类。 PrivateOptionsAPIResponse上的定义(由xsd.exe工具生成)显示:

public partial class PrivateOptionsAPIResponse {

private object itemField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("CountiesForPostalCodeResponse", typeof(ZipCodeValidationResponse))]
[System.Xml.Serialization.XmlElementAttribute("PlanDetailsForIndividualOrFamilyResponse", typeof(IndividualPlanBenefitResponse))]
[System.Xml.Serialization.XmlElementAttribute("PlansForIndividualOrFamilyResponse", typeof(IndividualPlanQuoteResponse))]
[System.Xml.Serialization.XmlElementAttribute("ProductDetailsForSmallGroupResponse", typeof(SmallGroupProductBenefitResponse))]
[System.Xml.Serialization.XmlElementAttribute("ProductsForSmallGroupResponse", typeof(SmallGroupProductQuoteResponse))]
public object Item {
    get {
        return this.itemField;
    }
    set {
        this.itemField = value;
    }
}

}

如果我然后浏览到ZipCodeValidationResponse定义,它会显示:

public partial class ZipCodeValidationResponse {

private CountyType[] countiesField;

/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("County", IsNullable=false)]
public CountyType[] Counties {
    get {
        return this.countiesField;
    }
    set {
        this.countiesField = value;
    }
}

}

如果我然后在CountyType上浏览定义,我会看到:

public partial class CountyType {

private string countyNameField;

private StateAbbreviationType stateCodeField;

/// <remarks/>
public string CountyName {
    get {
        return this.countyNameField;
    }
    set {
        this.countyNameField = value;
    }
}

/// <remarks/>
public StateAbbreviationType StateCode {
    get {
        return this.stateCodeField;
    }
    set {
        this.stateCodeField = value;
    }
}

}

----------工作解决方案----------------:

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            string status = ((HttpWebResponse)response).StatusDescription;

            if(status == "OK")
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        var xmlSerializer = new XmlSerializer(typeof(PrivateOptionsAPIResponse));
                        var privateOptionsAPIResponse = xmlSerializer.Deserialize(reader) as PrivateOptionsAPIResponse;
                    }
                }                    
            }
        }

2 个答案:

答案 0 :(得分:1)

您如何声明您的streamReader?看看它的内容,你很可能会看到它是空的或者不包含完整的XML文档。

答案 1 :(得分:0)

首先,检查您的XML是否有效。从给定的异常中,您似乎提供了无效的xml文档。如果你可以发布你想要序列化的内容(xml),我们非常感激。