C# XML 可序列化集合

Posted

技术标签:

【中文标题】C# XML 可序列化集合【英文标题】:C# XML Serializable Collection 【发布时间】:2012-04-09 19:57:49 【问题描述】:

我得到了下面的 XML(它只是我遇到问题的大型 XML 的一部分),我正在尝试制作一个 Serializable 类来读取它。

<BANKTRANLIST>
  <DTSTART>20051001</DTSTART>
  <DTEND>20051028</DTEND>
  <STMTTRN> <!-- This element can repeat any number of times -->
    <TRNTYPE>CHECK</TRNTYPE>
    <DTPOSTED>20051004</DTPOSTED>
    <TRNAMT>-200.00</TRNAMT>
  </STMTTRN>
  <STMTTRN>
    <TRNTYPE>ATM</TRNTYPE>
    <DTPOSTED>20051020</DTPOSTED>
    <TRNAMT>-300.00</TRNAMT>
  </STMTTRN>
</BANKTRANLIST>

我的 C# 实现

[Serializable]
[XmlRoot("BANKTRANLIST", Namespace = "http://bank.net", IsNullable = false)]
public class BankTransactionList

    public BankTransactionList()
    
        this.StatementTransactions = new List<StatementTransaction>();
    

    [XmlElement("DTSTART")]
    public string StartDate  get; set; 

    [XmlElement("DTEND")]
    public string EndDate  get; set; 

    [XmlArray("STMTTRN")]
    [XmlArrayItem("STMTTRN")]
    public List<StatementTransaction> StatementTransactions  get; set; 



[Serializable]
[XmlRoot("STMTTRN", Namespace = "http://bank.net", IsNullable = false)]
public class StatementTransaction

    // TransactionType : ENUM
    [XmlElement("TRNTYPE")]
    public TransactionType TransactionType  get; set; 

    [XmlElement("DTPOSTED")]
    public string DatePosted  get; set; 

    [XmlElement("TRNAMT")]
    public double TransactionAmount  get; set; 

我的问题是元素再次包裹在元素中,结果得到以下输出

...
    <STMTTRN> <!-- This does not match my Original XML -->
      <STMTTRN>
        <TRNTYPE>CHECK</TRNTYPE>
        <DTPOSTED>20051004</DTPOSTED>
        <TRNAMT>-200.00</TRNAMT>
      </STMTTRN>
      <STMTTRN>
        <TRNTYPE>ATM</TRNTYPE>
        <DTPOSTED>20051020</DTPOSTED>
        <TRNAMT>-300.00</TRNAMT>
      </STMTTRN>
    </STMTTRN>

注意:从 List 属性中删除 [XmlArray("STMTTRN")] 标记将无法解决此问题,而是

如果有人可以纠正我或给我一个更好的解决方案,那就太好了!

【问题讨论】:

【参考方案1】:

如果您希望每个项目都有一个元素而没有包装器元素,则应为 [XmlElement]

[XmlElement("STMTTRN")]
public List<StatementTransaction> StatementTransactions  get; set; 

【讨论】:

【参考方案2】:

我要补充一点,为了序列化你需要这样的集合:

[Serializable]
[XmlRoot("BANKTRANLIST", Namespace = "http://bank.net", IsNullable = false)]
public class BankTransactionList

    public BankTransactionList()
    
        StatementTransactions = new List<StatementTransaction>()
        
            new StatementTransaction()
        ;
    

    [XmlElement("DTSTART")]
    public string StartDate  get; set; 

    [XmlElement("DTEND")]
    public string EndDate  get; set; 

    [XmlElement("STMTTRN")]
    public List<StatementTransaction> StatementTransactions  get; set; 

否则,如果不初始化StatementTransaction对象,列表将不会被序列化。

【讨论】:

以上是关于C# XML 可序列化集合的主要内容,如果未能解决你的问题,请参考以下文章

XML可序列化集合

如何使用 C# 中的 System.Xml.Serialization 使对象不可变但可序列化?

一个可序列化的C#对象,如何转成一个XML格式的文件或字符串

如何用 ItemName 中的数字序列化 XML 集合?

C#:带有循环链接的节点的 xml 序列化

UserControl 集合未标记为可序列化