2011-02-03 28 views
38

Tôi đang gặp rắc rối thực sự cố gắng deserialize một số XML và hy vọng ai đó có thể cung cấp một số trợ giúp. Tôi đã đọc rất nhiều bài đăng tương tự nhưng tôi không thể giải quyết vấn đề này.Lỗi Deserializing Xml để Object - xmlns = '' đã không được dự kiến ​​

XML Tôi đang cố gắng deserialize

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

Lớp Tôi cố gắng để deserialize tới:

[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; 
} 

Deserialization Phương pháp

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); 
     } 
    } 

Deserialization Method Gọi

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

Ngoại lệ:

Có một lỗi trong tài liệu XML (1, 2). ---> System.InvalidOperationException: là không được mong đợi. tại Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()

Nội ngoại lệ như sau:

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

Trả lời

48

Chỉ cần cất cánh Namespace =:

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

vì xml của bạn dường như không nằm trong vùng tên xml. Ngoài ra, [Serializable] không được sử dụng bởi XmlSerializer.

Nếu xml của bạn đang sử dụng không gian tên, nó sẽ có số xmlns ở gốc.

Ngoài ra, để trợ giúp với người gọi, bạn có thể thêm where T : class, new() (, new() làm phương thức bổ sung) vào phương thức Deserialize của mình, vì yêu cầu một công cụ xây dựng không tham số công khai.

+1

Marc bạn đã phát hiện ra! Tôi không thể cảm ơn đủ vì tôi đã xé tóc ra với cái này. – ProNotion

+0

Cảm ơn bạn rất nhiều! Thông tin bổ sung về không gian tên là giải pháp tôi cần. – varagrawal

+0

Bạn có thể vui lòng cho biết thêm về lý do tại sao "Không gian tên =" trong lớp là không cần thiết? – gfan

-1

tôi thấy làm cố định sau này đối với tôi

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")); 
} 
Các vấn đề liên quan