この質問は以前に聞かれましたが、答えがうまくいきません:XMLに名前空間がない場合、XmlRoot名前空間で装飾されたクラスを逆シリアル化する方法はありますか?
XMLをデシリアライズしようとすると本当に問題が発生しています。私は似たような投稿をたくさん読んだが、これを解決することはできない。ここで
私がデシリアライズしようとしているXML
<register-account success="false">
<user-name>xxxxx</user-name>
<password>fghgh</password>
<email>[email protected]</email>
</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; }
}
デシリアライズ方法
public static T Deserialize<T>(string data) where T : class
{
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.
(削除Namespace = "MyNamespace")。ただし、クラスはxsd.exeを使用して自動生成される非常に大きなライブラリの一部です。私は、生成されたクラスの中で何も変更したくありません。クラスを変更することなくこの問題を解決するにはまだ離れていますか?
それがXML全体であるとすると、表示したXMLには名前空間(xmlns宣言なし)がありません。したがって、クラスのシリアライゼーションパラメータから削除することは意味があります。そうでない場合は、XSDを介してクラスを再生成し、ネームスペースなしでクラスを生成させます。 – Reddog
XSD.exeがクラスと一緒にクラスを生成することをサポートしているとは思いません。 –