/// <summary> /// Returns list of all transactions in OFX document /// </summary> /// <param name="doc">OFX document</param> /// <returns>List of transactions found in OFX document</returns> private void ImportTransations(OFXDocument ofxDocument, XmlDocument doc) { var xpath = GetXPath(ofxDocument.AccType, OFXSection.TRANSACTIONS); ofxDocument.StatementStart = doc.GetValue(xpath + "/DTSTART").ToDate(); ofxDocument.StatementEnd = doc.GetValue(xpath + "/DTEND").ToDate(); var transactionNodes = doc.SelectNodes(xpath + "/STMTTRN"); ofxDocument.Transactions = new List <Transaction>(); foreach (XmlNode node in transactionNodes) { ofxDocument.Transactions.Add(new Transaction(node, ofxDocument.Currency)); } }
private OFXDocument Parse(string ofxString) { var ofx = new OFXDocument { AccType = GetAccountType(ofxString) }; //Load into xml document var doc = new XmlDocument(); doc.Load(new StringReader(ofxString)); var currencyNode = doc.SelectSingleNode(GetXPath(ofx.AccType, OFXSection.CURRENCY)); if (currencyNode != null) { ofx.Currency = currencyNode.FirstChild.Value; } else { throw new OFXParseException("Currency not found"); } //Get sign on node from OFX file var signOnNode = doc.SelectSingleNode(Moses.Core.Ofx.Ofx.SignOn); //If exists, populate signon obj, else throw parse error if (signOnNode != null) { ofx.SignOn = new SignOn(signOnNode); } else { throw new OFXParseException("Sign On information not found"); } //Get Account information for ofx doc var accountNode = doc.SelectSingleNode(GetXPath(ofx.AccType, OFXSection.ACCOUNTINFO)); //If account info present, populate account object if (accountNode != null) { ofx.Account = new Account(accountNode, ofx.AccType); } else { throw new OFXParseException("Account information not found"); } //Get list of transactions ImportTransations(ofx, doc); //Get balance info from ofx doc var ledgerNode = doc.SelectSingleNode(GetXPath(ofx.AccType, OFXSection.BALANCE) + "/LEDGERBAL"); var avaliableNode = doc.SelectSingleNode(GetXPath(ofx.AccType, OFXSection.BALANCE) + "/AVAILBAL"); //If balance info present, populate balance object // ***** OFX files from my bank don't have the 'avaliableNode' node, so i manage a 'null' situation if (ledgerNode != null) // && avaliableNode != null { ofx.Balance = new Balance(ledgerNode, avaliableNode); } else { throw new OFXParseException("Balance information not found"); } return(ofx); }