2011-02-03 21 views
38

XMLをデシリアライズしようとすると本当に問題が発生しました。私は似たような投稿をたくさん読んだが、これを解決することはできない。Xmlをオブジェクトに逆シリアル化する際にエラーが発生しました - xmlns = ''が予想外でした

[Serializable, XmlRoot(ElementName = "register-account", Namespace = "MyNamespace")] 
[XmlType("register-account")] 
public class RegisterAccountResponse 
{ 
    [XmlAttribute("success")] 
    public bool Success { get; set; } 

    /// <summary> 
    /// Gets or sets the Tennant email address 
    /// </summary> 
    [XmlElement("email")] 
    public string Email { get; set; } 

    /// <summary> 
    /// Gets or sets the tennant password 
    /// </summary> 
    [XmlElement("password")] 
    public string Password { get; set; } 

    /// <summary> 
    /// Gets or sets the Tennant username 
    /// </summary> 
    [XmlElement("user-name")] 
    public string Username { get; set; } 

    /// <summary> 
    /// A Tenant Portal error relating to the RegisterAccountRequest 
    /// </summary> 
    [XmlElement("error")] 
    public QubeError Error; 
} 

デシリアライズ方法

public static T Deserialize<T>(string data) where T : class 
    { 
     if (data == null) 
     { 
      return null; 
     } 

     if (data.Trim().Length == 0) 
     { 
      return null; 
     } 

     var ser = new XmlSerializer(typeof(T)); 

     using (var sr = new StringReader(data)) 
     { 
      return (T)ser.Deserialize(sr); 
     } 
    } 
:私は私がデシリアライズしようとしています

<register-account success="false"> 
    <user-name>xxxxx</user-name> 
    <password>fghgh</password> 
    <email>[email protected]</email> 
    <error> 
    <errorcode>120</errorcode> 
    <errormessage>The password is invalid</errormessage> 
    </error> 
</register-account> 

クラスをデシリアライズしようとしています

XML

デシリアライズメソッド呼び出し

var data = Helper.Deserialize<RegisterAccountResponse>(xml); 

例外:

XMLドキュメント(1、 2)に誤りがあります。 ---> System.InvalidOperationException: が期待されていませんでした。 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

内部例外で、次のように:

<register-account xmlns=''> was not expected. 

答えて

48
私のためにこれを固定以下やりました

単に離してくださいNamespace =

[XmlRoot("register-account"), XmlType("register-account")] 
public class RegisterAccountResponse {...} 

xmlがxml-namespaceにないようです。また[Serializable]XmlSerializerで使用されていません。

xmlが名前空間を使用していた場合は、ルートにxmlnsがあります。 XmlSerializerは、公共のパラメータなしのコンストラクタを要求するので

はまた、発信者を支援するために、あなたは、あなたの Deserialize方法に where T : class, new(), new()が追加されて)を追加することができます。

+1

Marcあなたがスポットにいた!私はこれで私の髪を裂いていたので、十分にあなたに感謝することはできません。 – ProNotion

+0

ありがとう!名前空間に関する追加情報は私が必要とした解決策でした。 – varagrawal

+0

「Namespace =」が不要な理由を教えてください。 – gfan

-1

私は

if (elem.Attribute(XNamespace.Xmlns + "xsi") == null) { 
    elem.Add(new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance")); 
} 

if (elem.Attribute(XNamespace.Xmlns + "xsd") == null) { 
    elem.Add(new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema")); 
} 
関連する問題