52

一部の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.
4

3 に答える 3

56

単に脱ぐNamespace =

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

xmlがxml-namespaceにないように見えるためです。また、[Serializable]では使用されませんXmlSerializer

xmlが名前空間を使用している場合はxmlns、ルートにがあります。

また、呼び出し元を支援するために、メソッドにwhere T : class, new(), new()追加である)追加することができます。これは、パブリックパラメーターのないコンストラクターを必要とするためです。DeserializeXmlSerializer

于 2011-02-03T09:38:49.667 に答える
2

ここでは何も機能しませんでした

うまくいったのは、xml文字列をマップ/逆シリアル化しようとしているC#クラス(メインクラス)が、応答のルート要素と一致するXmlRootAttributeを持っていることを確認することです。

例https://stackoverflow.com/a/61525536/1594274で私の完全な答えを確認して ください

于 2020-04-30T14:24:33.060 に答える
-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"));
}
于 2011-02-03T09:38:29.153 に答える