使用嵌套列表将 XML 文件转换为 C# 对象

Posted

技术标签:

【中文标题】使用嵌套列表将 XML 文件转换为 C# 对象【英文标题】:Convert XML file to C# object with nested Lists 【发布时间】:2021-05-25 04:03:10 【问题描述】:

我有这个 XML 文件,我正试图反序列化为 C# 对象,关闭 Tabke 标记不会显示,但除此之外:

<Table>
<ConditionSets>
    <ConditionSet Name="All Coastal Exposures">
        <Condition Field="State" Values="GA,FL,NC,AL"/>
        <Condition Field="Client" Values="Default,ICAT,Olympus,SJIC"/>
        <Condition Field="Company" Values="GM,ACME,NWGF,DSFN,DSIC"/>
        <Condition Field="Product" Values="HO,FO"/>
        <Condition Field="Program" Values="*"/>
        <Condition Field="LineOfBusiness" Values="HO,FO,DF,IM"/>
        <Condition Field="TransactionType" Values="NB,RN,CH,RR,RW,RE"/>
        <Condition Field="TransactionMode" Values="Q,A"/>
        <Condition Field="UserType" Values="A,E"/>
        <Condition Field="Process" Values="Q,R,I"/>
        <Condition Field="Environment" Values="DEV,QA,UAT,PROD"/>
        <Condition Field="System" Values="BASE,SBIC,DSFM,NCIC"/>
        <Condition Field="Page" Values="Applicant,Completion"/>
        <Condition Field="Expression" Values="PolTransPolicy.BillingMethodCd='D'"/>
    </ConditionSet>
    <ConditionSet Name="Midwest Region">
        <Condition Field="State" Values="IL,IO,WI,MI,MN"/>
        <Condition Field="Client" Values="*"/>
        <Condition Field="Company" Values="GMIC,BMIC"/>
        <Condition Field="Product" Values="HO,FO,DF"/>
        <Condition Field="Program" Values="*"/>
        <Condition Field="LineOfBusiness" Values="HO,FO,DF,IM,PU"/>
        <Condition Field="TransactionType" Values="NB,RN,CH,RR,RW,RE"/>
        <Condition Field="TransactionMode" Values="Q,A"/>
        <Condition Field="UserType" Values="A,E"/>
        <Condition Field="Process" Values="Q,R,I"/>
        <Condition Field="Environment" Values="DEV,QA"/>
        <Condition Field="System" Values="BASE,GMIC,BMIC"/>
        <Condition Field="Page" Values="*"/>
        <Condition Field="Expression" Values="PolTransPolicy.BillingMethodCd='D'"/>
    </ConditionSet>
</ConditionSets>

我似乎无法正确反序列化它,因为它是一个列表列表。如何在 C# 对象中正确设置它以进行反序列化?

这是我用来反序列化的类

[XmlRoot("Table")]
    public class Table
    
        [XmlArray("ConditionSets")]
        [XmlArrayItem("ConditionSet")]
        public List<ConditionSet> ConditionSets  get; set; 
    

    public class ConditionSet
    
        [XmlAttribute("Name")]
        public string Name  get; set; 

        [XmlArray("Conditions")]
        [XmlArrayItem("Condition")]
        public List<Condition> Conditions  get; set; 
    

    public class Condition
    
        [XmlAttribute("Field")]
        public string Field  get; set; 

        [XmlAttribute("Values")]
        public string Values  get; set; 
    

【问题讨论】:

你能解释一下你到目前为止所做的尝试吗? 嗨,Austin,欢迎来到 ***。可以详细说明你的问题吗?您面临什么问题?列表中的列表在哪里?另外,分享您尝试反序列化的类。 【参考方案1】:

首先,修复您的 XML。您需要像 xml 这样的***节点。那么您缺少 ConditionSets 结束节点。

完成后,您可以使用此工具将您的 XML 转换为 C# 反序列化代码:

Json2Charp

【讨论】:

【参考方案2】:

您不能使用 [XmlArray("Conditions")] [XmlArrayItem("Condition")] 而是简单地使用

[XmlElement()] public List<Condition> Conditions  get; set;  

如果你的条件行包含在 .. 中,你的方法会奏效。

【讨论】:

这行不通,因为标签是 Condition 并且变量名是Condition。所以以下任何一个都可以工作 1) [XmlElement()] public List Condition get;放; 2) [XmlElement("Condition")] public List 条件 get;放;

以上是关于使用嵌套列表将 XML 文件转换为 C# 对象的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 转换为 c# 对象

将 XML 文件转换为具有列表的 XML 对象 [重复]

XmlSerializer C# - 对象传递的简单值被转换并显示为 xml 文件中的科学值

C# JSON 将文件反序列化为对象列表失败,并将字符串转换为集合错误

将 XML 转换为 C# 类的工具 [重复]

用于将 XML 数据转换为 html 文件的 C# 与 XSLT [关闭]