Ошибка десериализации Xml в Object - xmlns = '' не ожидалось
У меня возникают реальные проблемы с десериализацией некоторых XML и надеюсь, что кто-то может оказать некоторую помощь. Я прочитал много подобных сообщений, но я не могу это решить.
XML Я пытаюсь десериализовать
<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>
Класс Я пытаюсь десериализовать:
[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);
}
}
Метод десериализации Вызов
var data = Helper.Deserialize<RegisterAccountResponse>(xml);
Исключение:
В документе XML есть ошибка (1, 2). --- > Исправление System.InvalidOperationException: было неожиданно. в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderData.Read5_data()
Внутреннее исключение:
<register-account xmlns=''> was not expected.
Ответы
Ответ 1
Просто снимите Namespace =
:
[XmlRoot("register-account"), XmlType("register-account")]
public class RegisterAccountResponse {...}
так как ваш xml не находится в пространстве имен xml. Кроме того, [Serializable]
не используется XmlSerializer
.
Если ваш xml использовал пространство имен, он имел бы xmlns
в корне.
Кроме того, чтобы помочь с абонентами, вы можете добавить where T : class, new()
(, new()
дополнение) к вашему методу Deserialize
, так как XmlSerializer
требует открытого конструктора без параметров.
Ответ 2
Я нашел, что для меня это исправлено.
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"));
}