An adapter for converting ChangeSetHistory records into XElements, and vice-versa.
 /// <summary>
 /// Converts a given <see cref="T:XElement"/> into an <see cref="T:Account"/>.
 /// </summary>
 /// <param name="element">The <see cref="T:XElement"/> to convert.</param>
 /// <returns>The newly created <see cref="T:Account"/>.</returns>
 public Account FromXElement(XElement element)
 {
     Account account = AccountFactory.Create(element.Name.LocalName);
     foreach (XElement childNode in element.Nodes()) {
         switch (childNode.Name.LocalName) {
             case "AccountID":
                 account.AccountID = new Guid(childNode.Value);
                 break;
             case "CreatedByUsername":
                 account.CreatedByUsername = childNode.Value;
                 break;
             case "CreatedDate":
                 account.CreatedDate = DateTime.Parse(childNode.Value);
                 break;
             case "Description":
                 account.Description = childNode.Value;
                 break;
             case "Name":
                 account.Name = childNode.Value;
                 break;
             case "UpdatedByUsername":
                 account.UpdatedByUsername = childNode.Value;
                 break;
             case "UpdatedDate":
                 account.UpdatedDate = DateTime.Parse(childNode.Value);
                 break;
             case "ChangeSetHistory":
                 ChangeSetHistoryXElementAdapter adapter = new ChangeSetHistoryXElementAdapter();
                 account.ChangeSetHistory = adapter.FromXElement(childNode);
                 break;
         }
     }
     return account;
 }
        /// <summary>
        /// Converts a given <see cref="Account"/> into an <see cref="T:XElement"/>.
        /// </summary>
        /// <param name="account">The <see cref="Account"/> to convert.</param>
        /// <returns>The newly created <see cref="T:XElement"/>.</returns>
        public XElement ToXElement(Account account)
        {
            XElement element = new XElement(account.AccountType.ToString());
            element.Add(new XElement("AccountID", account.AccountID));
            element.Add(new XElement("CreatedByUsername", account.CreatedByUsername));
            element.Add(new XElement("CreatedDate", account.CreatedDate));
            element.Add(new XElement("Description", account.Description));
            element.Add(new XElement("Name", account.Name));
            element.Add(new XElement("UpdatedByUsername", account.UpdatedByUsername));
            element.Add(new XElement("UpdatedDate", account.UpdatedDate));

            // Append the change history
            ChangeSetHistoryXElementAdapter adapter = new ChangeSetHistoryXElementAdapter();
            element.Add(adapter.ToXElement(account.ChangeSetHistory));

            return element;
        }
 /// <summary>
 /// Converts a given <see cref="T:XElement"/> into a <see cref="T:Transaction"/>.
 /// </summary>
 /// <param name="element">The <see cref="T:XElement"/> to convert.</param>
 /// <param name="workbook">The <see cref="T:Workbook"/> to use to fetch additional information for the <see cref="Transaction"/>.</param>
 /// <returns>The newly created <see cref="T:Transaction"/>.</returns>
 public Transaction FromXElement(XElement element, Workbook workbook)
 {
     Transaction transaction = new Transaction();
     foreach (XElement childNode in element.Nodes()) {
         switch (childNode.Name.LocalName) {
             case "DebitAccountID":
                 transaction.DebitAccount = workbook.FetchAccount(new Guid(childNode.Value));
                 break;
             case "CreditAccountID":
                 transaction.CreditAccount = workbook.FetchAccount(new Guid(childNode.Value));
                 break;
             case "CreatedByUsername":
                 transaction.CreatedByUsername = childNode.Value;
                 break;
             case "CreatedDate":
                 transaction.CreatedDate = DateTime.Parse(childNode.Value);
                 break;
             case "Date":
                 transaction.Date = DateTime.Parse(childNode.Value);
                 break;
             case "Particulars":
                 transaction.Particulars = childNode.Value;
                 break;
             case "TransactionID":
                 transaction.TransactionID = new Guid(childNode.Value);
                 break;
             case "Value":
                 transaction.Value = decimal.Parse(childNode.Value);
                 break;
             case "UpdatedByUsername":
                 transaction.UpdatedByUsername = childNode.Value;
                 break;
             case "UpdatedDate":
                 transaction.UpdatedDate = DateTime.Parse(childNode.Value);
                 break;
             case "ChangeSetHistory":
                 ChangeSetHistoryXElementAdapter adapter = new ChangeSetHistoryXElementAdapter();
                 transaction.ChangeSetHistory = adapter.FromXElement(childNode);
                 break;
         }
     }
     return transaction;
 }
        /// <summary>
        /// Converts a given <see cref="Transaction"/> into an <see cref="T:XElement"/>.
        /// </summary>
        /// <param name="transaction">The <see cref="Transaction"/> to convert.</param>
        /// <returns>The newly created <see cref="T:XElement"/>.</returns>
        public XElement ToXElement(Transaction transaction)
        {
            XElement element = new XElement("Transaction");
            element.Add(new XElement("DebitAccountID", transaction.DebitAccount.AccountID));
            element.Add(new XElement("CreditAccountID", transaction.CreditAccount.AccountID));
            element.Add(new XElement("CreatedByUsername", transaction.CreatedByUsername));
            element.Add(new XElement("CreatedDate", transaction.CreatedDate));
            element.Add(new XElement("Date", transaction.Date));
            element.Add(new XElement("Particulars", transaction.Particulars));
            element.Add(new XElement("TransactionID", transaction.TransactionID));
            element.Add(new XElement("Value", transaction.Value));
            element.Add(new XElement("UpdatedByUsername", transaction.UpdatedByUsername));
            element.Add(new XElement("UpdatedDate", transaction.UpdatedDate));

            // Append the change history
            ChangeSetHistoryXElementAdapter adapter = new ChangeSetHistoryXElementAdapter();
            element.Add(adapter.ToXElement(transaction.ChangeSetHistory));

            return element;
        }