【问题标题】:XML Recursive DeserializationXML 递归反序列化
【发布时间】:2011-06-15 13:27:32
【问题描述】:

我有一些要反序列化的 XML。 Kronos_WCF 对象可以很好地反序列化,但 Response 对象不能。我缺少一些递归反序列化技术吗?

这是我要反序列化的 XML:

<?xml version='1.0' encoding='UTF-8' ?>
<Kronos_WFC Version="1.0" WFCVersion="6.2.0.4" TimeStamp="6/15/2011 9:15AM GMT-04:00">
<Response Status="Success" Timeout="1800" PersonKey="-1" Object="System" UserName="User" Action="Logon" PersonNumber="User">
</Response>
<Response Status="Success" Object="System" UserName="User" Action="Logoff">
</Response>
</Kronos_WFC>

这是我的反序列化器:

public static T Deserialize<T>(this string xml)
{
    var ser = new XmlSerializer(typeof (T));
    object obj;
    using (var stringReader = new StringReader(xml))
    {
        using (var xmlReader = new XmlTextReader(stringReader))
        {
            obj = ser.Deserialize(xmlReader);
        }
    }
    return (T) obj;
}

这是我在 VS2010 中看到的屏幕截图:

这是使用 XSD.exe 生成的类的代码:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlRootAttribute("Kronos_WFC", Namespace = "", IsNullable = false)]
public class Kronos_WFCType
{

    private object[] m_itemsField;

    private string m_timeStampField;

    private string m_versionField;

    private string m_wFcVersionField;

    /// <remarks/>
    [XmlElementAttribute("Request", typeof(RequestType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [XmlElementAttribute("Response", typeof(ResponseType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [XmlElementAttribute("Transaction", typeof(TransactionType), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public object[] Items
    {
        get
        {
            return m_itemsField;
        }
        set
        {
            m_itemsField = value;
        }
    }

    [XmlAttributeAttribute()]
    public string TimeStamp
    {
        get
        {
            return m_timeStampField;
        }
        set
        {
            m_timeStampField = value;
        }
    }

    /// <remarks/>
    [XmlAttributeAttribute()]
    public string Version
    {
        get
        {
            return m_versionField;
        }
        set
        {
            m_versionField = value;
        }
    }

    /// <remarks/>
    [XmlAttributeAttribute()]
    public string WFCVersion
    {
        get
        {
            return m_wFcVersionField;
        }
        set
        {
            m_wFcVersionField = value;
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public class ResponseType
{

    private string messageField;

    private string sequenceField;

    private string statusField;

    private string transactionSequenceField;

    /// <remarks/>
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Message
    {
        get
        {
            return messageField;
        }
        set
        {
            messageField = value;
        }
    }

    /// <remarks/>
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Sequence
    {
        get
        {
            return sequenceField;
        }
        set
        {
            sequenceField = value;
        }
    }

    /// <remarks/>
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Status
    {
        get
        {
            return statusField;
        }
        set
        {
            statusField = value;
        }
    }

    /// <remarks/>
    [XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string TransactionSequence
    {
        get
        {
            return transactionSequenceField;
        }
        set
        {
            transactionSequenceField = value;
        }
    }
}

任何帮助将不胜感激。

【问题讨论】:

  • 如果您可以发布Kronos_WFC 类的代码会有所帮助。
  • Response
  • 我已经添加了课程
  • 没有直接关系,但您不应该使用new XmlTextReader()。自 .NET 2.0 以来,它已被弃用。请改用XmlReader.Create()

标签: c# xml serialization xml-serialization


【解决方案1】:

Response 中定义的Status 属性错误

应该是

[XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Status

实际上是

[XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]

所以 xml 反序列化器正在寻找

<Response><Status>Success</Status></Response>

这至少可以让你反序列化Response.Status

xml sn-p 看起来与类定义不匹配。

【讨论】:

  • 我是从 API 供应商提供的 XSD 生成的。有没有办法在使用 XSD.exe 生成类时设置它,还是只需要手动更改?谢谢。
  • 如果 xsd 来自供应商,而 xml 响应来自同一供应商的产品,我会与供应商讨论。
  • @Cyber​​drew re:XSD 我不知道。相反,我会修改提供的 XSD 以匹配您收到的 xml,以便生成正确的类 。我还会问供应商为什么 XSD 和示例 xml 不匹配。
  • 谢谢,会的。谢谢您的帮助。恕我直言,这个产品的 API 很垃圾。
【解决方案2】:

xml 中的 Response 属性似乎与您班级中的那些不匹配。

【讨论】:

  • 我自己也注意到了,但它不会填充它找到的那些吗?
猜你喜欢
  • 2021-07-16
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2014-06-10
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多