我有一些問題反序列化一個XML文檔。我想反序列化的文件是這樣的:XmlSerializer.Deserialize問題根元素缺失或元素不是預期的
<slt:CreateGiftRegistryResponse xmlns:slt="http://WWW.example.com/">
<slt:Response>
<slt:ResponseCode>ERROR</slt:ResponseCode>
<slt:ResponseDescription>Request unsuccessfull null</slt:ResponseDescription>
</slt:Response></slt:CreateGiftRegistryResponse>
我的類看起來是這樣的:
/// <summary>
/// response to attempt to add items to a registry
/// </summary>
[XmlRoot("CreateGiftRegistryResponse")]
public class CreateRegistryResponse : ResponseBase
{
// Constant Declarations
// Variable Declarations
#region --- Constructors ---
public CreateRegistryResponse()
: this(String.Empty) { }
/// <summary>
/// response to attempt to add items to a registry
/// </summary>
/// <param name="response">xml string</param>
public CreateRegistryResponse(string responseXml)
{
try
{
Load(responseXml);
}
catch (Exception ex)
{
// Report the exception and throw to the caller for handling.
ExceptionManager.Publish(ex,
"ctor CreateRegistryResponse() failed.",
Severity.Fatal);
throw;
}
}
#endregion
#region --- Properties ---
/// <summary>
/// structure for the typical response - code and description
/// </summary>
[XmlElement("Response")]
public ResponseWS Response { get; set; }
#endregion
#region --- Static Methods ---
#endregion
#region --- CRUD ---
#endregion
#region --- Validation ---
#endregion
#region --- Business Methods ---
/// <summary>
/// Load the web service result string into a Result.
/// </summary>
public void Load(string response)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(CreateRegistryResponse), this.GetExtraTypes());
byte[] byteArray = Encoding.ASCII.GetBytes(response);
MemoryStream stream = new MemoryStream(byteArray);
// convert the results into a usable format
CreateRegistryResponse formattedResponse = serializer.Deserialize(stream) as CreateRegistryResponse;
this.Response = formattedResponse.Response;
if (formattedResponse.Response.ResponseCode == ResponseCode.SUCCESS.ToString())
{
this.IsSuccessful = true;
}
}
catch (Exception ex)
{
// Report the exception and throw to the caller for handling.
ExceptionManager.Publish(ex,
"Load() failed. Unable to authenticate user.",
Severity.Fatal);
throw;
}
finally
{
//
// TODO: Add clean-up code here, if needed.
//
}
}
/// <summary>
/// Get an array of types that are possibly contained within this class
/// </summary>
public Type[] GetExtraTypes()
{
try
{
//
// TODO: Add code here.
//
// build an array of possible types within this type.
List<Type> types = new List<Type>();
types.Add(typeof(ResponseWS));
return types.ToArray();
}
catch (Exception ex)
{
// Report the exception and throw to the caller for handling.
ExceptionManager.Publish(ex,
"GetExtraTypes() failed. Unable to return list",
Severity.Fatal);
throw;
}
}
#endregion
}
當我使用此代碼,我得到這個錯誤:{「HTTP://kiosk.surlatable 「}
如果我將XmlRoot元素更改爲也包含名稱空間,那麼我的錯誤更改爲根元素缺失。
我以爲其中的一個會給我我期望的結果,但事實並非如此。有人可以發現我在這裏失蹤的東西嗎?
XSD.exe實際上是罪魁禍首!我基於教程使用它,並且在開始理解時沒有做足夠的閱讀。這個問題肯定與我的類裝飾器。我相信有2個根宣言。它現在工作得很好。 – mkeller 2010-09-18 19:40:40