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 可序列化集合的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 中的 System.Xml.Serialization 使对象不可变但可序列化?