繁体   English   中英

C# XML 可序列化集合

[英]C# XML Serializable Collection

我得到了下面的 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")] 标签不会解决这个问题,而是

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

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

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

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

[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对象,列表将不会被序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM