2013-11-22 6 views
1

Я получаю следующую ошибку, пытающуюся десериализовать xml. Это вызывает ошибку:XMLSerializer не десериализует XML

XmlSerializer serializer = новый XmlSerializer (typeof (PrivateOptionsAPIResponse));
var result = serializer.Deserialize (streamReader);

Исключение:

System.InvalidOperationException был пойман
сообщение = Существует ошибка в документе XML (0, 0)
InnerException: System.Xml.XmlException
Message = Корневой элемент отсутствует
Source = 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 инструмент) показывает:

общественный частичный класс 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; 
        } 
       }      
      } 
     } 
+1

Предполагая, что содержимое читателя проверено, вам может потребоваться принудительно заставить читателя разместить его в контентной позиции с помощью «streamReader.MoveToContent()». –

ответ

1

Как вы объявляете свой streamReader? Взгляните на его содержимое, и вы, скорее всего, увидите, что он пуст или не содержит полный XML-документ.

+0

Объявление streamRader выглядит следующим образом: using (var streamReader = new StreamReader (response.GetResponseStream())) – obautista

+0

Вы комментируете меня, чтобы посмотреть, как я объявляю. Я обновил свое оригинальное сообщение рабочим решением. Благодарю. – obautista

0

Прежде всего, проверьте, находится ли ваш XML в действительной форме. Из данного исключения кажется, что вы поставляете недопустимый xml-документ. Очень ценю, если бы вы могли опубликовать содержимое (xml), которое вы пытаетесь выполнить сериализацией.

+0

Выполнение этого на StreamReader: var xdoc = XDocument.Parse (streamReader.ReadToEnd()); Возвращает строку (XML) в моем исходном сообщении. – obautista

Смежные вопросы