【问题标题】:C# - How to Deserialize XML with a List in a ListC# - 如何使用列表中的列表反序列化 XML
【发布时间】:2022-01-08 12:59:15
【问题描述】:

这是我收到的来自 SOAP 调用的响应的 XML:

<?xml version='1.0' encoding='UTF-8'?>
<Usage_Data Public="0">
    <Type_Data Primary="1">
        <Type_Reference>
            <ID type="WID">4fae289a7fe541b098ca9448e462ff6b</ID>
            <ID type="Communication_Usage_Type_ID">BUSINESS</ID>
        </Type_Reference>
    </Type_Data>
    <Use_For_Reference>
        <ID type="WID">7a232f5736a840a393b8ab43df7becd5</ID>
        <ID type="Communication_Usage_Behavior_ID">BILLING</ID>
    </Use_For_Reference>
    <Use_For_Reference>
        <ID type="WID">b58a4a54e04c4e1f8fc32bfc3b1a77cf</ID>
        <ID type="Communication_Usage_Behavior_ID">SHIPPING</ID>
    </Use_For_Reference>
    <Use_For_Reference>
        <ID type="WID">8f470e4f6ffd49638c80ea6b5443bddb</ID>
        <ID type="Communication_Usage_Behavior_ID">REMIT</ID>
    </Use_For_Reference>
</Usage_Data>

我已经使用它创建了一个 C# 类,以便我可以反序列化 XML。生成的类很丑陋,不幸的是它不起作用。我已经对其进行了足够的调整以使其有些工作。最大的问题在于“Use_For_Reference”元素。每个“ID”元素中的“type”属性没有被拉入反序列化的类中。

[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class Usage_Data
{
    private Usage_DataType_Data type_DataField;
    private List<Usage_DataUse_For_ReferenceID> use_For_ReferenceField;
    private byte publicField;

    public Usage_DataType_Data Type_Data
    {
        get => type_DataField;
        set => type_DataField = value;
    }

    [XmlArrayItem("ID", typeof(Usage_DataUse_For_ReferenceID), IsNullable = false)]
    public List<Usage_DataUse_For_ReferenceID> Use_For_Reference
    {
        get => use_For_ReferenceField;
        set => use_For_ReferenceField = value;
    }

    [XmlAttribute]
    public byte Public
    {
        get => publicField;
        set => publicField = value;
    }
}

[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class Usage_DataType_Data
{
    private Usage_DataType_DataID[] type_ReferenceField;
    private byte primaryField;

    [XmlArrayItem("ID", IsNullable = false)]
    public Usage_DataType_DataID[] Type_Reference
    {
        get => type_ReferenceField;
        set => type_ReferenceField = value;
    }

    [XmlAttribute]
    public byte Primary
    {
        get => primaryField;
        set => primaryField = value;
    }
}

[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class Usage_DataType_DataID
{
    private string typeField;
    private string valueField;

    [XmlAttribute]
    public string type
    {
        get => typeField;
        set => typeField = value;
    }

    [XmlText]
    public string Value
    {
        get => valueField;
        set => valueField = value;
    }
}

[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class Usage_DataUse_For_ReferenceID
{
    private string typeField;
    private string valueField;

    [XmlAttribute]
    public string type
    {
        get => typeField;
        set => typeField = value;
    }

    [XmlText]
    public string Value
    {
        get => valueField;
        set => valueField = value;
    }
}

请帮我弄清楚如何从 XML 反序列化中获取“类型”属性。谢谢!

【问题讨论】:

  • 为什么不直接推出自己的 LINQ-to-XML 解决方案?
  • 我的 XML 实际上比我上面显示的要复杂得多。我只显示我遇到问题的部分。我从来没有做过 LINQ-to-XML。如果我展示的东西大约有 5 层深,使用这个 XML 会不会很困难?
  • 您能否展示您的完整 XML?也许在 pastebin 中?

标签: c# xml


【解决方案1】:

这对你有用吗?

// using System.Xml.Serialization;
// XmlSerializer serializer = new XmlSerializer(typeof(UsageData));
// using (StringReader reader = new StringReader(xml))
// {
//    var test = (UsageData)serializer.Deserialize(reader);
// }

[XmlRoot(ElementName="ID")]
public class ID { 

    [XmlAttribute(AttributeName="type")] 
    public string Type { get; set; } 

    [XmlText] 
    public string Text { get; set; } 
}

[XmlRoot(ElementName="Type_Reference")]
public class TypeReference { 

    [XmlElement(ElementName="ID")] 
    public List<ID> ID { get; set; } 
}

[XmlRoot(ElementName="Type_Data")]
public class TypeData { 

    [XmlElement(ElementName="Type_Reference")] 
    public TypeReference TypeReference { get; set; } 

    [XmlAttribute(AttributeName="Primary")] 
    public int Primary { get; set; } 

    [XmlText] 
    public string Text { get; set; } 
}

[XmlRoot(ElementName="Use_For_Reference")]
public class UseForReference { 

    [XmlElement(ElementName="ID")] 
    public List<ID> ID { get; set; } 
}

[XmlRoot(ElementName="Usage_Data")]
public class UsageData { 

    [XmlElement(ElementName="Type_Data")] 
    public TypeData TypeData { get; set; } 

    [XmlElement(ElementName="Use_For_Reference")] 
    public List<UseForReference> UseForReference { get; set; } 

    [XmlAttribute(AttributeName="Public")] 
    public int Public { get; set; } 

    [XmlText] 
    public string Text { get; set; } 
}

使用:https://json2csharp.com/xml-to-csharp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多