Click here to Skip to main content
15,896,481 members
Articles / Mobile Apps

Yahoo! Managed

Rate me:
Please Sign up or sign in to vote.
4.87/5 (56 votes)
8 Jan 2015Apache12 min read 529.8K   25.5K   262  
Download financial data, managing online portfolio or using Search BOSS from Yahoo! with .NET
' ******************************************************************************
' ** 
' **  Yahoo Finance Managed
' **  Written by Marius Häusler 2010
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2010 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************


Namespace Finance.ImportExport

    ''' <summary>
    ''' Class for parsing managed data to and from XML
    ''' </summary>
    ''' <remarks></remarks>
    Public Class XML
        Private ReadOnly mHelper As New MyHelper
        Private ReadOnly mFinanceHelper As New FinanceHelper

        ''' <summary>
        ''' Writes a QuoteBaseData to XML format
        ''' </summary>
        ''' <param name="writer">The used XML writer</param>
        ''' <param name="quote">The used QuoteBaseData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <remarks></remarks>
        Public Sub FromQuoteBaseData(ByVal writer As XmlTextWriter, ByVal quote As QuoteBaseData, Optional ByVal culture As Globalization.CultureInfo = Nothing)
            Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
            If culture IsNot Nothing Then ci = culture
            With writer
                .WriteStartElement("Quote")

                If quote.ID <> String.Empty Then .WriteAttributeString("ID", quote.ID)

                .WriteStartElement(FinanceHelper.NameQuoteBaseID)
                .WriteValue(quote.ID)
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseLastTradePriceOnly)
                .WriteValue(mHelper.ObjectToString(quote.LastTradePriceOnly, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseChange)
                .WriteValue(mHelper.ObjectToString(quote.Change, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseOpen)
                .WriteValue(mHelper.ObjectToString(quote.Open, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseDaysHigh)
                .WriteValue(mHelper.ObjectToString(quote.DaysHigh, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseDaysLow)
                .WriteValue(mHelper.ObjectToString(quote.DaysLow, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseVolume)
                .WriteValue(mHelper.ObjectToString(quote.Volume, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseLastTradeDate)
                .WriteValue(quote.LastTradeDate.ToShortDateString)
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameQuoteBaseLastTradeTime)
                .WriteValue(quote.LastTradeTime.ToShortTimeString)
                .WriteEndElement()

                .WriteEndElement()
            End With
        End Sub
        ''' <summary>
        ''' Tries to read QuoteBaseData from XML
        ''' </summary>
        ''' <param name="quote">The XML node of a QuotesBaseData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <returns>The converted basic quote data or Nothing</returns>
        ''' <remarks></remarks>
        Public Function ToQuoteBaseData(ByVal quote As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As QuoteBaseData
            If quote IsNot Nothing AndAlso quote.Name.ToLower = "quote" Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim q As New QuoteBaseData
                For Each propertyNode As XmlNode In quote.ChildNodes
                    Select Case propertyNode.Name
                        Case FinanceHelper.NameQuoteBaseID : q.SetID(propertyNode.InnerText)
                        Case FinanceHelper.NameQuoteBaseLastTradePriceOnly : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, q.LastTradePriceOnly)
                        Case FinanceHelper.NameQuoteBaseLastTradeDate : Date.TryParse(propertyNode.InnerText, ci, Globalization.DateTimeStyles.AdjustToUniversal, q.LastTradeDate)
                        Case FinanceHelper.NameQuoteBaseLastTradeTime : Date.TryParse(propertyNode.InnerText, ci, Globalization.DateTimeStyles.AdjustToUniversal, q.LastTradeTime)
                        Case FinanceHelper.NameQuoteBaseChange : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, q.Change)
                        Case FinanceHelper.NameQuoteBaseOpen : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, q.Open)
                        Case FinanceHelper.NameQuoteBaseDaysHigh : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, q.DaysHigh)
                        Case FinanceHelper.NameQuoteBaseDaysLow : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, q.DaysLow)
                        Case FinanceHelper.NameQuoteBaseVolume : Long.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Integer, ci, q.Volume)
                    End Select
                Next
                Return q
            Else
                Return Nothing
            End If
        End Function

        ''' <summary>
        ''' Writes a QuoteData to XML format
        ''' </summary>
        ''' <param name="writer">The used XML writer</param>
        ''' <param name="quote">The used QuoteData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <remarks></remarks>
        Public Sub FromQuoteData(ByVal writer As XmlTextWriter, ByVal quote As QuoteData, Optional ByVal culture As Globalization.CultureInfo = Nothing)
            Me.FromQuoteData(writer, quote, Nothing, culture)
        End Sub
        ''' <summary>
        ''' Writes a QuoteData to XML format
        ''' </summary>
        ''' <param name="writer">The used XML writer</param>
        ''' <param name="quote">The used QuoteData</param>
        ''' <param name="properties">The used properties of the quotes</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <remarks></remarks>
        Public Sub FromQuoteData(ByVal writer As XmlTextWriter, ByVal quote As QuoteData, ByVal properties As IEnumerable(Of QuoteProperty), Optional ByVal culture As Globalization.CultureInfo = Nothing)
            Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
            If culture IsNot Nothing Then ci = culture
            With writer
                .WriteStartElement("Quote")
                If quote.Values(QuoteProperty.Symbol) IsNot Nothing Then .WriteAttributeString("ID", quote.Values(QuoteProperty.Symbol).ToString())
                Dim prps() As QuoteProperty = mFinanceHelper.CheckPropertiesOfQuotesData(New QuoteData() {quote}, properties)
                For Each qp As QuoteProperty In prps
                    .WriteStartElement(qp.ToString)
                    .WriteValue(mHelper.ObjectToString(quote(qp), ci))
                    .WriteEndElement()
                Next
                .WriteEndElement()
            End With
        End Sub
        ''' <summary>
        ''' Tries to read a QuoteData from XML
        ''' </summary>
        ''' <param name="node">The XML node of a QuoteData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <returns>The converted quote data or Nothing</returns>
        ''' <remarks></remarks>
        Public Function ToQuoteData(ByVal node As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As QuoteData
            If node IsNot Nothing AndAlso node.Name.ToLower = "quote" Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim quote As New QuoteData
                Dim properties As New List(Of QuoteProperty)
                For i As Integer = 0 To QuoteProperty.YearRange
                    properties.Add(DirectCast(i, QuoteProperty))
                Next
                For Each propertyNode As XmlNode In node.ChildNodes
                    For p As QuoteProperty = 0 To QuoteProperty.YearRange
                        If propertyNode.Name = p.ToString Then
                            quote(p) = mHelper.StringToObject(propertyNode.InnerText, ci)
                            Exit For
                        End If
                    Next
                Next
                Return quote
            Else
                Return Nothing
            End If
        End Function

        ''' <summary>
        ''' Writes a QuoteOption to XML format
        ''' </summary>
        ''' <param name="writer">The used XML writer</param>
        ''' <param name="quoteOption">The used QuoteOption</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <remarks></remarks>
        Public Sub FromQuoteOption(ByVal writer As XmlTextWriter, ByVal quoteOption As QuoteOptionData, Optional ByVal culture As Globalization.CultureInfo = Nothing)
            Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
            If culture IsNot Nothing Then ci = culture
            With writer
                .WriteStartElement("Option")

                .WriteAttributeString(FinanceHelper.NameOptionSymbol, quoteOption.Symbol)
                .WriteAttributeString(FinanceHelper.NameOptionType, IIf(quoteOption.Type = QuoteOptionType.Call, "C", "P").ToString)

                .WriteStartElement(FinanceHelper.NameOptionLastPrice)
                .WriteValue(mHelper.ObjectToString(quoteOption.LastPrice, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionStrikePrice)
                .WriteValue(mHelper.ObjectToString(quoteOption.StrikePrice, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionChange)
                .WriteValue(mHelper.ObjectToString(Math.Abs(quoteOption.Change), ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionChangeDir)
                .WriteValue(IIf(quoteOption.Change >= 0, "Up", "Down").ToString)
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionBid)
                .WriteValue(mHelper.ObjectToString(quoteOption.Bid, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionAsk)
                .WriteValue(mHelper.ObjectToString(quoteOption.Ask, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionVolume)
                .WriteValue(mHelper.ObjectToString(quoteOption.Volume, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameOptionOpenInterest)
                .WriteValue(mHelper.ObjectToString(quoteOption.OpenInterest, ci))
                .WriteEndElement()

                .WriteEndElement()
            End With
        End Sub
        ''' <summary>
        ''' Tries to read a QuoteOption from XML
        ''' </summary>
        ''' <param name="node">The XML node of QuoteOption</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <returns>The converted quote data or Nothing</returns>
        ''' <remarks></remarks>
        Public Function ToQuoteOption(ByVal node As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As QuoteOptionData
            If node IsNot Nothing AndAlso node.Name.ToLower = "option" Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim symbol As String = String.Empty
                Dim t As String = String.Empty
                For Each att As XmlAttribute In node.Attributes
                    Select Case att.Name
                        Case FinanceHelper.NameOptionSymbol : symbol = att.Value
                        Case "type" : t = att.Value
                    End Select
                Next
                Dim type As QuoteOptionType = QuoteOptionType.Call
                If t.ToLower = "p" Then type = QuoteOptionType.Put
                Dim strikePrice, lastPrice, change, bid, ask As Double
                Dim volume, openInt As Integer
                For Each propertyNode As XmlNode In node.ChildNodes
                    Select Case propertyNode.Name
                        Case FinanceHelper.NameOptionStrikePrice : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, strikePrice)
                        Case FinanceHelper.NameOptionLastPrice : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, lastPrice)
                        Case FinanceHelper.NameOptionChange : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, change)
                        Case FinanceHelper.NameOptionChangeDir : If propertyNode.InnerText = "Down" Then change *= -1
                        Case FinanceHelper.NameOptionBid : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, bid)
                        Case FinanceHelper.NameOptionAsk : Double.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Currency, ci, ask)
                        Case FinanceHelper.NameOptionVolume : Integer.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Integer, ci, volume)
                        Case FinanceHelper.NameOptionOpenInterest : Integer.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Integer, ci, openInt)
                    End Select
                Next
                Return New QuoteOptionData(symbol, type, strikePrice, lastPrice, change, bid, ask, volume, openInt)
            Else
                Return Nothing
            End If
        End Function

        ''' <summary>
        ''' Writes HistQuoteData to XML format
        ''' </summary>
        ''' <param name="writer">The used XML writer</param>
        ''' <param name="quote">The used HistQuoteData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <remarks>Creates a main node for all periods</remarks>
        Public Sub FromHistQuoteData(ByVal writer As XmlTextWriter, ByVal quote As HistQuoteData, Optional ByVal culture As Globalization.CultureInfo = Nothing)
            Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
            If culture IsNot Nothing Then ci = culture
            With writer
                .WriteStartElement("HistQuote")

                .WriteStartElement(FinanceHelper.NameHistQuoteDate)
                .WriteValue(quote.TradingDate.ToShortDateString)
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameHistQuoteOpen)
                .WriteValue(mHelper.ObjectToString(quote.Open, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameHistQuoteHigh)
                .WriteValue(mHelper.ObjectToString(quote.High, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameHistQuoteLow)
                .WriteValue(mHelper.ObjectToString(quote.Low, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameHistQuoteClose)
                .WriteValue(mHelper.ObjectToString(quote.Close, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameHistQuoteVolume)
                .WriteValue(mHelper.ObjectToString(quote.Volume, ci))
                .WriteEndElement()

                .WriteStartElement(FinanceHelper.NameHistQuoteAdjClose)
                .WriteValue(mHelper.ObjectToString(quote.CloseAdjusted, ci))
                .WriteEndElement()

                .WriteEndElement()
            End With
        End Sub
        ''' <summary>
        ''' Tries to read a HistQuoteData from XML
        ''' </summary>
        ''' <param name="node">The XML node of HistQuoteData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <returns>The converted historic quote data or Nothing</returns>
        ''' <remarks></remarks>
        Public Function ToHistQuoteData(ByVal node As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As HistQuoteData
            If node IsNot Nothing AndAlso node.Name.ToLower = "histquote" AndAlso node.ChildNodes.Count > 0 Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim qd As New HistQuoteData
                For Each cNode As XmlNode In node.ChildNodes
                    Select Case cNode.Name
                        Case FinanceHelper.NameHistQuoteDate : Date.TryParse(node.ChildNodes(0).InnerText, qd.TradingDate)
                        Case FinanceHelper.NameHistQuoteOpen : Double.TryParse(node.ChildNodes(1).InnerText, Globalization.NumberStyles.Currency, ci, qd.Open)
                        Case FinanceHelper.NameHistQuoteHigh : Double.TryParse(node.ChildNodes(2).InnerText, Globalization.NumberStyles.Currency, ci, qd.High)
                        Case FinanceHelper.NameHistQuoteLow : Double.TryParse(node.ChildNodes(3).InnerText, Globalization.NumberStyles.Currency, ci, qd.Low)
                        Case FinanceHelper.NameHistQuoteClose : Double.TryParse(node.ChildNodes(4).InnerText, Globalization.NumberStyles.Currency, ci, qd.Close)
                        Case FinanceHelper.NameHistQuoteVolume : Long.TryParse(node.ChildNodes(5).InnerText, Globalization.NumberStyles.Integer, ci, qd.Volume)
                        Case FinanceHelper.NameHistQuoteAdjClose : Double.TryParse(node.ChildNodes(6).InnerText, Globalization.NumberStyles.Currency, ci, qd.CloseAdjusted)
                    End Select
                Next
                Return qd
            Else
                Return Nothing
            End If
        End Function

        ''' <summary>
        ''' Writes an ExchangeRateData to XML format
        ''' </summary>
        ''' <param name="writer">The used XML writer</param>
        ''' <param name="rateData">The used ExchangeRateData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <remarks></remarks>
        Public Sub FromExchangeRateData(ByVal writer As XmlTextWriter, ByVal rateData As Support.ExchangeRateData, Optional ByVal culture As Globalization.CultureInfo = Nothing)
            If writer IsNot Nothing Then
                With writer
                    .WriteStartElement("ExchangeRate")

                    .WriteStartElement("BaseName")
                    .WriteValue(rateData.CurrencyRelation.BaseName)
                    .WriteEndElement()
                    .WriteStartElement("DepName")
                    .WriteValue(rateData.CurrencyRelation.DepName)
                    .WriteEndElement()
                    .WriteStartElement("Symbol")
                    .WriteValue(rateData.CurrencyRelation.ID)
                    .WriteEndElement()
                    .WriteStartElement("BaseCurrency")
                    .WriteValue(rateData.CurrencyRelation.BaseCurrency.ToString)
                    .WriteEndElement()
                    .WriteStartElement("DepCurrency")
                    .WriteValue(rateData.CurrencyRelation.DepCurrency.ToString)
                    .WriteEndElement()

                    FromQuoteBaseData(writer, rateData, culture)

                    .WriteEndElement()
                End With
            End If
        End Sub
        ''' <summary>
        ''' Tries to read an ExchangeRateData from XML
        ''' </summary>
        ''' <param name="node">The XML node of ExchangeRateData</param>
        ''' <param name="culture">The used culture for formating dates and numbers. If parameter value is null/Nothing, default Culture will be used.</param>
        ''' <returns>The converted exchange item or Nothing</returns>
        ''' <remarks></remarks>
        Public Function ToExchangeRateData(ByVal node As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As Support.ExchangeRateData
            If node IsNot Nothing AndAlso node.Name.ToLower = "exchangerate" Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim base, dep As Currency
                Dim qData As New QuoteBaseData
                Dim foundB, foundD As Boolean
                For Each cNode As XmlNode In node.ChildNodes
                    Select Case cNode.Name.ToLower
                        Case "basecurrency"
                            For cur As Currency = 0 To Currency.ZWD
                                If cur.ToString.ToUpper = cNode.InnerText.ToUpper Then
                                    base = cur
                                    foundB = True
                                End If
                            Next
                        Case "depcurrency"
                            For cur As Currency = 0 To Currency.ZWD
                                If cur.ToString.ToUpper = cNode.InnerText.ToUpper Then
                                    dep = cur
                                    foundD = True
                                End If
                            Next
                        Case "quote"
                            qData = Me.ToQuoteBaseData(cNode, ci)
                    End Select
                Next
                If foundB And foundD Then
                    Return New Support.ExchangeRateData(base, dep, qData)
                Else
                    Return Nothing
                End If
            End If
            Return Nothing
        End Function

        Public Function ToSector(ByVal sector As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As SectorData
            If sector IsNot Nothing AndAlso sector.Name.ToLower = "sector" Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim sect As New SectorData
                Dim nameAtt As XmlAttribute = sector.Attributes(FinanceHelper.NameMarketName)
                If nameAtt IsNot Nothing Then
                    For s As Sector = 0 To Finance.Sector.Utilities
                        If s.ToString.Replace("_", " ") = nameAtt.Value Then
                            sect.ID = s
                            Exit For
                        End If
                    Next
                End If
                For Each industryNode As XmlNode In sector.ChildNodes
                    If industryNode.Name = "industry" Then
                        Dim ind As New IndustryData
                        For Each att As XmlAttribute In industryNode.Attributes
                            If att.Name = FinanceHelper.NameIndustryID Then : Integer.TryParse(att.Value, ind.ID)
                            ElseIf att.Name = FinanceHelper.NameMarketName Then : ind.Name = att.Value
                            End If
                        Next
                        sect.Industries.Add(ind)
                    End If
                Next
                Return sect
            Else
                Return Nothing
            End If
        End Function
        Public Function ToIndustry(ByVal industry As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As IndustryData
            If industry.Name = "industry" Then
                Dim ind As New IndustryData
                For Each att As XmlAttribute In industry.Attributes
                    If att.Name = FinanceHelper.NameIndustryID Then : Integer.TryParse(att.Value, ind.ID)
                    ElseIf att.Name = FinanceHelper.NameMarketName Then : ind.Name = att.Value
                    End If
                Next
                For Each companyNode As XmlNode In industry.ChildNodes
                    If companyNode.Name = "company" Then
                        Dim comp As New CompanyInfoData
                        For Each att As XmlAttribute In companyNode.Attributes
                            If att.Name = FinanceHelper.NameCompanySymbol Then : comp.SetID(att.Value)
                            ElseIf att.Name = FinanceHelper.NameMarketName Then : comp.Name = att.Value
                            End If
                        Next
                        ind.Companies.Add(comp)
                    End If
                Next
                Return ind
            Else
                Return Nothing
            End If
        End Function
        Public Function ToCompanyData(ByVal stock As XmlNode, Optional ByVal culture As Globalization.CultureInfo = Nothing) As CompanyInfoData
            If stock.Name = "stock" Then
                Dim ci As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
                If culture IsNot Nothing Then ci = culture
                Dim stk As New CompanyInfoData
                For Each att As XmlAttribute In stock.Attributes
                    If att.Name = FinanceHelper.NameCompanySymbol Then stk.SetID(att.Value.ToUpper)
                Next
                For Each propertyNode As XmlNode In stock.ChildNodes
                    Select Case propertyNode.Name
                        Case FinanceHelper.NameCompanyCompanyName : stk.Name = propertyNode.InnerText
                        Case FinanceHelper.NameCompanyStart
                            Dim dte As Date
                            If Date.TryParse(propertyNode.InnerText.Replace(FinanceHelper.NameCompanyNotAvailable, "1"), ci, Globalization.DateTimeStyles.AssumeUniversal, dte) Then stk.StartDate = dte
                        Case FinanceHelper.NameCompanyEnd
                            Dim dte As Date
                            Dim dateStr As String = String.Empty
                            If propertyNode.InnerText.IndexOf(FinanceHelper.NameCompanyNotAvailable) > -1 Then
                                Dim dates As String() = propertyNode.InnerText.Split("-"c)
                                If dates.Length >= 3 Then
                                    If dates(0).IndexOf(FinanceHelper.NameCompanyNotAvailable) > -1 Then : dateStr &= Date.Now.Year.ToString & "-"
                                    Else : dateStr &= dates(0) & "-"
                                    End If
                                    If dates(1).IndexOf(FinanceHelper.NameCompanyNotAvailable) > -1 Then : dateStr &= Date.Now.Month.ToString & "-"
                                    Else : dateStr &= dates(1) & "-"
                                    End If
                                    If dates(2).IndexOf(FinanceHelper.NameCompanyNotAvailable) > -1 Then : dateStr &= Date.Now.Day.ToString & "-"
                                    Else : dateStr &= dates(2)
                                    End If
                                    If dates.Length > 3 Then
                                        dateStr &= "-"
                                        For i As Integer = 3 To dates.Length - 1
                                            dateStr &= dates(i) & "-"
                                        Next
                                    End If
                                Else
                                    dateStr = propertyNode.InnerText.Replace(FinanceHelper.NameCompanyNotAvailable, Date.Now.Month.ToString)
                                End If
                            End If
                            If Date.TryParse(dateStr, ci, Globalization.DateTimeStyles.AssumeUniversal, dte) Then stk.EndDate = dte
                        Case FinanceHelper.NameCompanySector : stk.SectorName = propertyNode.InnerText
                        Case FinanceHelper.NameCompanyIndustry : stk.IndustryName = propertyNode.InnerText
                        Case FinanceHelper.NameCompanyFullTimeEmployees
                            Dim i As Integer
                            If Integer.TryParse(propertyNode.InnerText, Globalization.NumberStyles.Any, ci, i) Then stk.FullTimeEmployees = i
                    End Select
                Next
                Return stk
            Else
                Return Nothing
            End If
        End Function

    End Class

End Namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions