【问题标题】:How to serialize / deserialize xml into a C# object?如何将 xml 序列化/反序列化为 C# 对象?
【发布时间】:2018-10-11 02:43:51
【问题描述】:

如何将此 xml 字符串序列化/反序列化为 C# 对象?

<Response>
    <Business Number="99696" Name="My business" Address=""  />
    <Purchase PurchaseID="7" CustomerID="0" >
        <Item Name="item 1" Qty="100" UnitCost="10.0000" />
        <Item Name="item2" Qty="200" UnitCost="20.0000" />
    </Purchase>
</Response>

谢谢 鲁本克

我认为是一个不同的问题,因为所有问题通常都讨论一个级别和/或项目列表

我的问题是我有不同的级别:

<Response>               //root
    <Business ... />     //level 1
    <Purchase... >       //level 1
        <Item ... />     // list

我的号码、姓名等为空。

这是我迄今为止尝试过的:

    [Serializable, XmlRoot("Response")]
    public class Response
    {
        public Depot depot = new Depot();

        // I have tried this also:
        //[XmlElement("Number")]
        //public string Number { get; set; }

        //[XmlElement("Name")]
        //public string Name { get; set; }
    }

    public class Depot
    {
        [XmlElement("Number")]
        public string Number { get; set; }

        [XmlElement("Name")]
        public string Name { get; set; }
    }


    static object DeserializeResponse(string responseString)
    {
        var serializer = new XmlSerializer(typeof(Response));

        Response result;
        using (var reader = new StringReader(responseString))
        {
            result = (Response)serializer.Deserialize(reader);
        }

        return result;
    }

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 您需要使用 [XmlAttribute] 属性标记从 xml 节点属性填充的对象属性,并使用 [XmlElement("Item")] 属性标记购买对象中的 Items 数组属性。在您构造所有类并将 Response 类类型提供给 XmlSerializer 构造函数之后,XmlSerializer 的 Deserialize 方法将完成这项工作。验证 Deserialize 的输出对象并在必要时修改对象类定义。
  • 好吧,没关系,我找到了解决办法
  • 请考虑删除这个问题(因为它很可能是重复的)或至少发布解决方案作为答案并接受它。
  • 不要将答案放在问题中,请回答您自己的问题,如stackoverflow.com/help/self-answer所示。

标签: c# xmlserializer


【解决方案1】:

我找到了解决方案:

public class Response
{
    [System.Xml.Serialization.XmlElementAttribute("Business", typeof(ResponseBusiness), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public object[] Items { get; set; }
}

public partial class ResponseBusiness
{
    string NumberField;

    string NameField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Number
    {
        get
        {
            return this.NumberField;
        }
        set
        {
            this.NumberField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.NameField;
        }
        set
        {
            this.NameField = value;
        }
    }

我这样调用 XmlSerializer 类:

var serializer = new XmlSerializer(typeof(Response), new XmlRootAttribute("Response"));

我可以这样阅读信息:

string businessNumber = ((ResponseBusiness)result.Items[0]).Number;

希望它可以帮助别人。

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2014-11-30
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-08-20
    • 2020-05-10
    相关资源
    最近更新 更多