Ошибка десериализации Xml для объекта - xmlns='' не ожидалось
У меня есть реальная проблема с попыткой десериализации некоторого XML, и я надеялся, что кто-то может предложить некоторую помощь. Я прочитал много подобных сообщений, но я не могу решить эту проблему.
XML я пытаюсь десериализовать
<register-account success="false">
<user-name>xxxxx</user-name>
<password>fghgh</password>
<email>test@example.com</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.
2 ответа
Просто сними Namespace =
:
[XmlRoot("register-account"), XmlType("register-account")]
public class RegisterAccountResponse {...}
поскольку ваш xml, кажется, не находится в пространстве имен xml. Также, [Serializable]
не используется XmlSerializer
,
Если бы ваш xml использовал пространство имен, он имел бы xmlns
в корне.
Кроме того, чтобы помочь с звонящими вы могли бы добавить where T : class, new()
(, new()
быть дополнением) к вашему Deserialize
метод, так как XmlSerializer
требует публичного конструктора без параметров.
У меня здесь ничего не работало
Что сработало, так это УБЕДИТЬСЯ, что класс C# (основной класс), который вы пытаетесь сопоставить / десериализовать строку xml, ИМЕЕТ атрибут XmlRootAttribute, который соответствует корневому элементу ответа.
Проверьте мой полный ответ с помощью примера /questions/10395172/polzovatel-xmlns-ne-ozhidalsya-deserializatsiya-twitter-xml/55156678#55156678
Я обнаружил, что делать следующее исправило это для меня
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"));
}