コード例 #1
0
        protected override NasdaqEarningForecastResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            List <NasdaqEarningForecastData> yearly    = new List <NasdaqEarningForecastData>(10);
            List <NasdaqEarningForecastData> quarterly = new List <NasdaqEarningForecastData>(10);

            System.Globalization.CultureInfo culture = Factory.DownloadCultureInfo;
            string pattern = @"<title>.*\((\w*)\).*</title>";

            if (stream != null)
            {
                var content = MyHelper.StreamToString(stream, System.Text.Encoding.UTF8);

                var matchPattern = "(<div class=\"genTable\">.*?</div>)";
                var match        = Regex.Matches(content, matchPattern, RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);

                XParseDocument year    = MyHelper.ParseXmlDocument(match[0].Groups[0].Value);
                XParseDocument quarter = MyHelper.ParseXmlDocument(match[1].Groups[0].Value);


                var symbol     = Regex.Match(content, pattern).Groups[1].Value;
                var resultNode = XPath.GetElement("//table", year);
                ParseTable(yearly, resultNode, symbol, "");

                resultNode = XPath.GetElement("//table", quarter);
                ParseTable(quarterly, resultNode, symbol, "");

                return(new NasdaqEarningForecastResult(yearly.ToArray(), quarterly.ToArray()));
            }
            return(null);
        }
コード例 #2
0
        protected override QuoteOptionsResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            List <QuoteOptionsDataChain> options = new List <QuoteOptionsDataChain>();

            System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");
            XParseDocument doc = MyHelper.ParseXmlDocument(stream);

            XParseElement[] mainLst = XPath.GetElements("//optionsChain", doc);

            foreach (XParseElement chain in mainLst)
            {
                string   idAtt             = MyHelper.GetXmlAttributeValue(chain, "symbol");
                string   expirationDateAtt = MyHelper.GetXmlAttributeValue(chain, "expiration");
                DateTime expirationDate    = default(DateTime);
                if (!System.DateTime.TryParseExact(expirationDateAtt, "yyyy-MM-dd", culture, System.Globalization.DateTimeStyles.None, out expirationDate))
                {
                    System.DateTime.TryParseExact(expirationDateAtt, "yyyy-MM", culture, System.Globalization.DateTimeStyles.None, out expirationDate);
                }
                List <QuoteOptionsData> lst = new List <QuoteOptionsData>();
                foreach (XParseElement optionNode in chain.Elements())
                {
                    if (optionNode.Name.LocalName == "option")
                    {
                        QuoteOptionsData opt = ImportExport.ToQuoteOption(optionNode, culture);
                        if (opt != null)
                        {
                            lst.Add(opt);
                        }
                    }
                }
                options.Add(new QuoteOptionsDataChain(idAtt, expirationDate, lst));
            }
            return(new QuoteOptionsResult(options.ToArray()));
        }
コード例 #3
0
        protected override TickerEarningDate ConvertResult(string contentStr, string ticker = "")
        {
            XParseDocument doc = MyHelper.ParseXmlDocument(contentStr);

#if DEBUG
            Console.WriteLine(contentStr);
#endif

            XParseElement resultNode = XPath.GetElement("//results/td/strong", doc);
            if (resultNode == null)
            {
                resultNode = XPath.GetElement("//results/td/b", doc);
            }
            if (resultNode == null)
            {
                return new TickerEarningDate {
                           Ticker = ticker
                }
            }
            ;

            var dateStr = resultNode.Value;
            var date    = MyHelper.ConvertEarningDate(dateStr);

            return(new TickerEarningDate {
                Ticker = ticker, EarningDate = date
            });
        }
    }
コード例 #4
0
        protected sealed override NasdaqEarningForecastAggregate ConvertResult(string contentStr, string ticker = "")
        {
            List <NasdaqEarningForecastData> yearly    = new List <NasdaqEarningForecastData>(10);
            List <NasdaqEarningForecastData> quarterly = new List <NasdaqEarningForecastData>(10);
            string pattern = @"<title>.*\((\w*)\).*</title>";

            if (!string.IsNullOrEmpty(contentStr))
            {
                var content = contentStr;

                var matchPattern = "(<div class=\"genTable\">.*?</div>)";
                var match        = Regex.Matches(content, matchPattern, RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);

                XParseDocument year    = MyHelper.ParseXmlDocument(match[0].Groups[0].Value);
                XParseDocument quarter = MyHelper.ParseXmlDocument(match[1].Groups[0].Value);


                var symbol     = Regex.Match(content, pattern).Groups[1].Value;
                var resultNode = XPath.GetElement("//table", year);
                ParseTable(yearly, resultNode, symbol, "", () => CreateData(Frequency.Yearly));

                resultNode = XPath.GetElement("//table", quarter);
                ParseTable(quarterly, resultNode, symbol, "", () => CreateData(Frequency.Quarterly));

                return(new NasdaqEarningForecastAggregate(yearly.ToArray(), quarterly.ToArray(), ticker));
            }
            return(null);
        }
コード例 #5
0
        protected override HoldingsResult ConvertResult(ConnectionInfo connInfo, System.IO.Stream stream, SettingsBase settings)
        {
            HoldingsDownloadSettings set = (HoldingsDownloadSettings)settings;
            XParseDocument           doc = MyHelper.ParseXmlDocument(stream);

            Holding[] result = this.ConvertHtmlDoc(doc, set.PortfolioID);
            return(new HoldingsResult(result));
        }
コード例 #6
0
        protected override AnalystRatingsDataAggregate ConvertResult(string contentStr, string ticker = "")
        {
            XParseDocument doc = MyHelper.GetResultTable(contentStr, 1, @"<table id='ratingstable'");

            XParseElement[]      rows = XPath.GetElements("//tr", doc);
            AnalystRatingsData[] data = GetResult <AnalystRatingsData>(rows);
            return(GetAggregate(data, _ => new AnalystRatingsDataAggregate(data)));
        }
コード例 #7
0
ファイル: CpiDataDownloader.cs プロジェクト: adamshe/wget
        protected override CpiDataAggregate ConvertResult(string content, string ticker = "")
        {
            //List<CpiData> dataList = new List<CpiData>(100);
            XParseDocument doc = MyHelper.GetResultTable(content, 1, "<table");

            XParseElement[] results = XPath.GetElements("//tr", doc);
            CpiData[]       data    = GetResult <CpiData>(results);
            return(GetAggregate(data, _ => new CpiDataAggregate(data)));
        }
コード例 #8
0
        public static XParseDocument GetResultTable(string content, int nthTable, string tableStart, string tableEnd = "</table>")
        {
            var startIndex = content.IndexOfOccurence(tableStart, nthTable);
            var endIndex   = content.IndexOf(tableEnd, startIndex, StringComparison.InvariantCultureIgnoreCase);

            var            targetTableStr = content.Substring(startIndex, endIndex + tableEnd.Length - startIndex);
            XParseDocument doc            = MyHelper.ParseXmlDocument(targetTableStr);

            return(doc);
        }
コード例 #9
0
        /// <summary>
        /// Loads a list of default currencies from market.xml
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static CurrencyInfo[] GetDefaultCurrencies()
        {
            List <CurrencyInfo> currencies = new List <CurrencyInfo>();
            XParseDocument      xmlDoc     = MyHelper.ParseXmlDocument(Properties.Resources.market);

            XParseElement[] curs = XPath.GetElements("//Resources/Currencies/Currency", xmlDoc);
            foreach (XParseElement curNode in curs)
            {
                currencies.Add(new CurrencyInfo(MyHelper.GetXmlAttributeValue(curNode, "ID"), MyHelper.GetXmlAttributeValue(curNode, "Name")));
            }
            return(currencies.ToArray());
        }
コード例 #10
0
        /// <summary>
        /// Loads default market information from market.xml
        /// </summary>
        /// <remarks></remarks>

        public static void FillCountriesWithIndices()
        {
            XParseDocument xmlDoc = MyHelper.ParseXmlDocument(Properties.Resources.market);

            XParseElement[] countryNodes = XPath.GetElements("//Resources/Countries/Country", xmlDoc);

            foreach (XParseElement countryNode in countryNodes)
            {
                CountryInfo ctr = null;

                string ctrIDStr = MyHelper.GetXmlAttributeValue(countryNode, "ID");
                foreach (CountryInfo defaultCtr in DefaultCountries)
                {
                    if (defaultCtr.ID.ToString() == ctrIDStr)
                    {
                        ctr = defaultCtr;
                        break;
                    }
                }

                if (ctr != null)
                {
                    ctr.Indices.Clear();
                    XParseElement indicesNode = XPath.GetElement("Indices", countryNode);
                    foreach (XParseElement indexNode in indicesNode.Elements())
                    {
                        if (indexNode.Name.LocalName == "Index")
                        {
                            string name = MyHelper.GetXmlAttributeValue(indexNode, "Name");
                            string id   = MyHelper.GetXmlAttributeValue(indexNode, "ID");

                            string        seStr = MyHelper.GetXmlAttributeValue(indexNode, "StockExchange");
                            StockExchange se    = null;
                            foreach (StockExchange defaultExc in mStockExchanges)
                            {
                                if (defaultExc.ID == seStr)
                                {
                                    se = defaultExc;
                                    break;
                                }
                            }

                            ctr.Indices.Add(new YIndexID(id)
                            {
                                Name          = name,
                                StockExchange = se
                            });
                        }
                    }
                }
            }
        }
コード例 #11
0
        protected override EarningHistoryDataAggregate ConvertResult(string content, string ticker = "")
        {
            List <EarningHistoryData> history = new List <EarningHistoryData>(10);
            var matchPattern = "(<div class=\"genTable\">.*?</div>)";
            var match        = Regex.Matches(content, matchPattern, RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);

            XParseDocument doc = MyHelper.ParseXmlDocument(match[0].Groups[0].Value);

            var resultNode = XPath.GetElement("//table", doc);

            ParseTable(history, resultNode, ticker, "");
            return(new EarningHistoryDataAggregate(history.ToArray(), ticker));
        }
コード例 #12
0
ファイル: WebFormUpload.cs プロジェクト: Bulletz4mysa/NBTrade
        private void dl_DownloadAsyncCompleted(DownloadClient <System.IO.Stream> sender, DownloadCompletedEventArgs <System.IO.Stream> e)
        {
            sender.AsyncDownloadCompleted -= this.dl_DownloadAsyncCompleted;
            XParseDocument doc = null;

            if (e.Response.Result != null)
            {
                doc = MyHelper.ParseXmlDocument(e.Response.Result);
            }
            if (this.AsyncUploadCompleted != null)
            {
                this.AsyncUploadCompleted(this, ((DefaultDownloadCompletedEventArgs <System.IO.Stream>)e).CreateNew(doc));
            }
        }
コード例 #13
0
ファイル: FeedDownload.cs プロジェクト: Bulletz4mysa/NBTrade
        protected override FeedResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            List <Feed>    feeds  = new List <Feed>();
            XParseDocument xmlDoc = MyHelper.ParseXmlDocument(stream);

            if (xmlDoc != null)
            {
                foreach (XParseElement f in XPath.GetElements("//channel", xmlDoc))
                {
                    feeds.Add(ImportExport.XML.ToFeed(f));
                }
            }
            return(new FeedResult(feeds.ToArray(), (FeedDownloadSettings)settings));
        }
コード例 #14
0
        protected override SuggestionResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            List <string>  lst = new List <string>();
            XParseDocument doc = MyHelper.ParseXmlDocument(stream);

            XParseElement[] results = XPath.GetElements("//s", doc);
            foreach (XParseElement resultNode in results)
            {
                string att = MyHelper.GetXmlAttributeValue(resultNode, "k");
                if (att != string.Empty)
                {
                    lst.Add(att);
                }
            }
            return(new SuggestionResult(lst.ToArray(), (SuggestionDownloadSettings)settings));
        }
コード例 #15
0
 protected override PlacesResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
 {
     if (settings is PlacesDownloadSettings)
     {
         List <PlacesData> places  = new List <PlacesData>();
         XParseDocument    doc     = MyHelper.ParseXmlDocument(stream);
         XParseElement[]   results = XPath.GetElements("//place", doc);
         foreach (XParseElement node in results)
         {
             places.Add(this.ToPlace(node));
         }
         return(new PlacesResult(places.ToArray()));
     }
     else
     {
         return(null);
     }
 }
コード例 #16
0
        protected override WeatherFeedResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            List <WeatherFeed> feeds  = new List <WeatherFeed>();
            XParseDocument     xmlDoc = MyHelper.ParseXmlDocument(stream);

            if (xmlDoc != null)
            {
                foreach (XParseElement feedNode in XPath.GetElements("//channel", xmlDoc))
                {
                    WeatherFeed feed = this.ToWeatherFeed(feedNode);
                    if (feed != null)
                    {
                        feeds.Add(feed);
                    }
                }
            }
            return(new WeatherFeedResult(feeds.ToArray()));
        }
コード例 #17
0
        /// <summary>
        /// Loads as list of default countries from market.xml
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static CountryInfo[] GetDefaultCountries()
        {
            List <CountryInfo> countries = new List <CountryInfo>();

            XParseDocument xmlDoc = MyHelper.ParseXmlDocument(Properties.Resources.market);

            XParseElement[] cntNodes = XPath.GetElements("//Resources/Countries/Country", xmlDoc);
            System.Globalization.CultureInfo convCulture = new System.Globalization.CultureInfo("en-US");

            foreach (XParseElement cntNode in cntNodes)
            {
                for (Country cnt = 0; cnt <= Country.VN; cnt++)
                {
                    if (cnt.ToString() == MyHelper.GetXmlAttributeValue(cntNode, "ID"))
                    {
                        CurrencyInfo cntCur = null;
                        string       curID  = MyHelper.GetXmlAttributeValue(cntNode, "Currency");
                        foreach (CurrencyInfo cur in DefaultCurrencies)
                        {
                            if (cur.ID.ToString() == curID)
                            {
                                cntCur = cur;
                                break;
                            }
                        }

                        XParseElement             dstNodes = XPath.GetElement("DaylightSavingTimes", cntNode);
                        List <DaylightSavingTime> dstList  = new List <DaylightSavingTime>();
                        foreach (XParseElement dstNode in dstNodes.Elements())
                        {
                            if (dstNode.Name.LocalName == "DST")
                            {
                                DateTime dstStart = Convert.ToDateTime(MyHelper.GetXmlAttributeValue(dstNode, "Start"), convCulture);
                                DateTime dstEnd   = Convert.ToDateTime(MyHelper.GetXmlAttributeValue(dstNode, "End"), convCulture);
                                dstList.Add(new DaylightSavingTime(dstStart, dstEnd));
                            }
                        }
                        countries.Add(new CountryInfo(cnt, MyHelper.GetXmlAttributeValue(cntNode, "Name"), cntCur, dstList.ToArray()));
                        break;
                    }
                }
            }
            return(countries.ToArray());
        }
コード例 #18
0
        public static XParseElement GetResultTable(string content, string matchPattern, string targetXpath)
        {
            try
            {
                var match = Regex.Matches(content, matchPattern, RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);

                var            targetTableStr = match[0].Groups[0].Value;
                XParseDocument doc            = MyHelper.ParseXmlDocument(targetTableStr);

                var resultNode = XPath.GetElement(targetXpath, doc);
                return(resultNode);
            }
            catch (Exception)
            {
                Debug.Write(matchPattern);
                Debug.Write(content);
            }
            return(null);
        }
コード例 #19
0
        protected override LocationIDSearchResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            List <LocationIDData> lst = new List <LocationIDData>();
            XParseDocument        doc = MyHelper.ParseXmlDocument(stream);

            XParseElement[] results = XPath.GetElements("//loc", doc);
            foreach (XParseElement locNode in results)
            {
                LocationIDData loc = new LocationIDData();
                loc.Name = locNode.Value;
                XParseAttribute att = locNode.Attribute(XParseName.Get("id"));
                if (att != null)
                {
                    loc.ID = att.Value;
                }
                lst.Add(loc);
            }
            return(new LocationIDSearchResult(lst.ToArray()));
        }
コード例 #20
0
ファイル: SecEdgarDownloader.cs プロジェクト: adamshe/wget
        protected override PositionChangeDataPointAggregate ConvertResult(string contentStr, string ticker = "")
        {
            string         startPattern     = "<table class=\"tableFile\" summary=\"Document Format Files\">";
            string         endPattern       = "</table>";
            int            startIndex       = contentStr.IndexOfOccurence(startPattern, 1);
            int            endIndex         = contentStr.IndexOf(endPattern, startIndex);
            string         normalizeContent = contentStr.Substring(startIndex, endIndex - startIndex + endPattern.Length);
            XParseDocument doc = MyHelper.ParseXmlDocument(normalizeContent);

            XParseElement resultNode = XPath.GetElement("//table/tr[3]/td[3]/a", doc);

            var xmlLink   = resultNode.Attribute("href").Value;
            var xmlResult = ParseForm4(GetSecPath(xmlLink));
            var aggregate = new PositionChangeDataPointAggregate(xmlResult);

            aggregate.PopulatePoints();
            Console.WriteLine(xmlResult);
            ////*[@id="formDiv"]/div/table/tbody/tr[3]/td[3]/a
            return(aggregate);
        }
コード例 #21
0
        protected override ValuationDataPointAggregate ConvertResult(string contentStr, string ticker = "")
        {
            var aggregate = new ValuationDataPointAggregate(ticker);

            if (!string.IsNullOrEmpty(contentStr))
            {
                var normalizeContent = contentStr;//.Replace("\r\n", "").Replace("\t", "");
                /*due to attribute without quotes, can't be parsed it as xml*/
                string startPattern = "<table";
                string endPattern   = "</table>";
                int    startIndex   = normalizeContent.IndexOfOccurence(startPattern, 5);
                int    endIndex     = normalizeContent.IndexOf(endPattern, startIndex);
                normalizeContent = normalizeContent.Substring(startIndex, endIndex - startIndex + endPattern.Length);
                var tempnormalizeContent = normalizeContent.Replace("\r\n", " ").Replace("\t", " ").Replace("\n", " ");
                normalizeContent = MyHelper.FixAttributes(tempnormalizeContent);
                XParseDocument doc        = MyHelper.ParseXmlDocument(normalizeContent);
                var            resultNode = XPath.GetElement("/table", doc);
                ParseTable(aggregate, resultNode, ticker, "");
                return(aggregate);
            }
            return(null);
        }
コード例 #22
0
        protected override HoldingDataPointAggregate ConvertResult(string contentStr, string ticker = "")
        {
            var aggregate = new HoldingDataPointAggregate(ticker);

            if (!string.IsNullOrEmpty(contentStr))
            {
                var normalizeContent = contentStr;//.Replace("\r\n", "").Replace("\t", "");
                /*due to attribute without quotes, can't be parsed it as xml*/
                string startPattern      = "<form";
                string endPattern        = "</form>";
                string startTablePattern = "<table>";
                string endTablePattern   = "</table>";

                int startIndex = normalizeContent.IndexOfOccurence(startPattern, 4);
                int endIndex   = normalizeContent.IndexOf(endPattern, startIndex);
                normalizeContent = normalizeContent.Substring(startIndex, endIndex - startIndex + endPattern.Length);
                var tempnormalizeContent = normalizeContent.Replace("\r\n", " ").Replace("\t", " ").Replace("\n", " ");
                normalizeContent = MyHelper.FixAttributes(tempnormalizeContent);
                XParseDocument doc = MyHelper.ParseXmlDocument(normalizeContent);
                string         temp;
                for (int i = 1; i <= 4; i++)
                {
                    startIndex = normalizeContent.IndexOfOccurence(startTablePattern, i);
                    endIndex   = normalizeContent.IndexOf(endTablePattern, startIndex);
                    temp       = normalizeContent.Substring(startIndex, endIndex - startIndex + endTablePattern.Length);
                    doc        = MyHelper.ParseXmlDocument(temp);
                    var ownershipSummaryTable = XPath.GetElement("//table", doc);
                    ParseTable(aggregate, ownershipSummaryTable);
                }
                //var activePositionTable = XPath.GetElement("//table[2]", doc);
                //var newSoldoutTable = XPath.GetElement("//table[3]", doc);
                //var holdingDetail = XPath.GetElement("//table[4]", doc);

                return(aggregate);
            }
            return(null);
        }
コード例 #23
0
        internal PortfolioInfoResult ConvertHtml(XParseDocument doc)
        {
            XParseElement        resultsNode = XPath.GetElement("//div[@id=\"yfi-main\"]/div/div[2]/form/div/table/tbody", doc);
            List <PortfolioInfo> lst         = new List <PortfolioInfo>();

            if (resultsNode != null)
            {
                foreach (XParseElement trNode in resultsNode.Elements())
                {
                    XParseElement a = XPath.GetElement("/td[2]/a", trNode);
                    if (a != null)
                    {
                        string          name = a.Value;
                        XParseAttribute att  = a.Attribute(XParseName.Get("href"));
                        if (att != null)
                        {
                            string id = att.Value.Split(';')[0].Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries)[1];
                            lst.Add(new PortfolioInfo(name, id));
                        }
                    }
                }
            }
            return(new PortfolioInfoResult(lst.ToArray()));
        }
コード例 #24
0
        protected override PortfolioInfoResult ConvertResult(ConnectionInfo connInfo, System.IO.Stream stream, SettingsBase settings)
        {
            XParseDocument doc = MyHelper.ParseXmlDocument(stream);

            return(this.ConvertHtml(doc));
        }
コード例 #25
0
        protected override AlphabeticIDIndexResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            AlphabeticIDIndexSettings s = (AlphabeticIDIndexSettings)settings;

            System.Globalization.CultureInfo convCulture = new System.Globalization.CultureInfo("en-US");
            XParseDocument doc = MyHelper.ParseXmlDocument(stream);

            XParseElement[] resultsNodes = null;

            switch (s.Type)
            {
            case AlphabeticalIndexDownloadType.TopIndex:
                resultsNodes = XPath.GetElements("//results", doc);
                List <AlphabeticalTopIndex> lstTopIndex = new List <AlphabeticalTopIndex>();

                if (resultsNodes.Length > 0)
                {
                    XParseElement resultNode = resultsNodes[0];

                    foreach (XParseElement tdNode in resultNode.Elements())
                    {
                        foreach (XParseElement aNode in tdNode.Elements())
                        {
                            if (aNode.Name.LocalName == "a")
                            {
                                string att = MyHelper.GetXmlAttributeValue(aNode, "href");
                                if (att != string.Empty)
                                {
                                    lstTopIndex.Add(new AlphabeticalTopIndex(aNode.Value, "http://biz.yahoo.com" + att));
                                }
                            }
                        }
                    }
                }

                return(new AlphabeticIDIndexResult(lstTopIndex.ToArray()));



            case AlphabeticalIndexDownloadType.Index:
                resultsNodes = XPath.GetElements("//results", doc);
                List <AlphabeticalIndex> lstIndex = new List <AlphabeticalIndex>();

                if (resultsNodes.Length > 0)
                {
                    XParseElement resultNode = resultsNodes[0];

                    foreach (XParseElement tdNode in resultNode.Elements())
                    {
                        foreach (XParseElement tableNode in tdNode.Elements())
                        {
                            if (tableNode.Name.LocalName == "table")
                            {
                                XParseElement[] chdLst = MyHelper.EnumToArray(MyHelper.EnumToArray(tableNode.Elements())[0].Elements());
                                if (chdLst.Length >= 3)
                                {
                                    lstIndex.Add(new AlphabeticalIndex(chdLst[1].Value, s.TopIndex.URL));
                                    if (chdLst.Length > 3)
                                    {
                                        for (int i = 3; i <= chdLst.Length - 1; i++)
                                        {
                                            XParseElement   tdTbNode = chdLst[i];
                                            XParseElement[] enm      = MyHelper.EnumToArray(tdTbNode.Elements());
                                            if (enm.Length > 0 && enm[0].Name.LocalName == "a")
                                            {
                                                string name = enm[0].Value.Replace("\n", "").Replace(" ", "").Trim();
                                                string url  = string.Empty;
                                                string att  = MyHelper.GetXmlAttributeValue(enm[0], "href");
                                                if (att != string.Empty)
                                                {
                                                    url = "http://biz.yahoo.com" + att.Trim();
                                                }
                                                if (url != string.Empty & name != string.Empty)
                                                {
                                                    lstIndex.Add(new AlphabeticalIndex(name, url));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                s.TopIndex.SetIndices(lstIndex.ToArray());
                return(new AlphabeticIDIndexResult(s.TopIndex.SubIndices));

            default:
                return(null);
            }
        }
コード例 #26
0
        //http:/table/regexhero.net/tester/
        protected override FinvizCompanyDetails ConvertResult(string contentStr, string ticker = "")
        {
#if DEBUG
            Console.WriteLine(contentStr);
#endif
            var    normalizeContent = contentStr.Replace("\r\n", "").Replace("\t", "");
            string startPattern     = "<table width=\"100%\" cellpadding=\"3\" cellspacing=\"0\" border=\"0\" class=\"snapshot-table2\">";
            string endPattern       = "</table>";
            int    startIndex       = normalizeContent.IndexOf(startPattern);
            int    endIndex         = normalizeContent.IndexOf("</table>", startIndex);

            var tableStr = normalizeContent.Substring(startIndex, endPattern.Length + endIndex - startIndex);

            //var tableStr = MyHelper.ExtractPattern(normalizeContent, ".*<table.*class=\"snapshot-table2\">(?<table>.*)</table>");
            XParseDocument             doc = MyHelper.ParseXmlDocument(tableStr);
            XParseElement              resultNode;// = XPath.GetElement("/table/tr[1]/td[2]/b", doc);
            object                     value = null;
            dynamic                    normalizeStr;
            XPathAttribute             xpath;
            RegularExpressionAttribute regex;
            var details = new FinvizCompanyDetails {
                Ticker = Setting.Ticker
            };
            foreach (var property in details.GetType().GetProperties())
            {
                xpath = property.GetCustomAttributes(typeof(XPathAttribute), false).FirstOrDefault() as XPathAttribute;

                if (xpath == null)
                {
                    continue;
                }



                resultNode = XPath.GetElement(xpath.Path, doc);

                var type = Nullable.GetUnderlyingType(property.PropertyType);

                normalizeStr = resultNode.Value;

                regex = property.GetCustomAttributes(typeof(RegularExpressionAttribute), false).FirstOrDefault() as RegularExpressionAttribute;

                try
                {
                    if (regex != null)
                    {
                        normalizeStr = MyHelper.NumerizeString(MyHelper.ExtractPattern(normalizeStr, regex.Pattern));
                    }
                    else if (property.PropertyType == typeof(DateTime))
                    {
                        normalizeStr = MyHelper.ConvertEarningDate(normalizeStr);
                    }
                    else if (property.PropertyType != typeof(string))
                    {
                        normalizeStr = MyHelper.NumerizeString(resultNode.Value);
                    }


                    if (type != null)
                    {
                        value = Convert.ChangeType(normalizeStr, type, MyHelper.DefaultCulture.NumberFormat);
                    }
                    else
                    {
                        value = Convert.ChangeType(normalizeStr, property.PropertyType);
                    }
                }
                catch (Exception ex)
                {
                    string msg = ex.Message;
                }

                property.SetValue(details, value);
            }

            return(details);
        }
コード例 #27
0
        protected override TrefisCompanyCoveredInfoAggregate ConvertResult(string contentStr, string ticker = "")
        {
            List <TrefisCompanyCoveredInfoData> companies = new List <TrefisCompanyCoveredInfoData>(100);
            var            normalizeContent = contentStr.Replace("\r\n", "").Replace("\t", "");
            XParseDocument doc = MyHelper.ParseXmlDocument(normalizeContent);

            int startIndex = normalizeContent.IndexOf("initCompanies(") + "initCompanies(".Length;
            int endIndex   = normalizeContent.IndexOf(");});</script>");


            var jsonStr = normalizeContent.Substring(startIndex, endIndex - startIndex);
            //     jsonStr = MyHelper.ExtractPattern(normalizeContent, @".*initCompanies\((?<content>.*)\);\}\);</script>");

            //  var serializer = new DataContractJsonSerializer(typeof(TrefisCompanyCoveredInfoData));// JavaScriptSerializer();

            List <TrefisCompanyCoveredInfoData> dataList = MyHelper.FromJson <List <TrefisCompanyCoveredInfoData> >(jsonStr);
            //serializer..Deserialize<List<TrefisCompanyCoveredInfoData>>(scriptContent);
            //XDocument xdoc = XDocument.Parse(normalizeContent);
            //XElement tempElement = null;
            //var rows = xdoc.XPathSelectElements("//tbody[@class=\"cmpTblBody\")]/tr");
            //foreach (var row in rows)
            //{
            //    var data = new TrefisCompanyCoveredInfoData();
            //    tempElement = row.Document.XPathSelectElement("/td[1]/a");
            //    data.CompanyName = tempElement.Value;

            //    data.Ticker = this.Setting.GetTickerFromUrl(tempElement.Attribute(XName.Get("href")).Value);

            //    tempElement = row.Document.XPathSelectElement("/td[2]/a");
            //    data.TrefisTarget = double.Parse(tempElement.Value, NumberStyles.Currency);

            //    tempElement = row.Document.XPathSelectElement("/td[3]");
            //    data.PriceGap = float.Parse(tempElement.Value);

            //    tempElement = row.Document.XPathSelectElement("/td[4]");
            //    data.Sector = tempElement.Value;

            //    tempElement = row.Document.XPathSelectElement("/td[5]");
            //    data.Industry = tempElement.Value;

            //    tempElement = row.Document.XPathSelectElement("/td[6]");
            //    data.Bearishness = float.Parse(tempElement.Value);

            //    companies.Add(data);
            //}
            var culture = MyHelper.DefaultCulture;

            XParseElement[] results  = XPath.GetElements("//tbody[@class=\"cmpTblBody\")]/tr", doc);
            XParseElement   tempNode = null;

            foreach (XParseElement row in results)
            {
                tempNode = XPath.GetElement("/td[1]/a", row);
                var data = dataList.Where(company => company.CompanyName == HttpUtility.HtmlDecode(tempNode.Value)).FirstOrDefault();
                tempNode    = XPath.GetElement("/td[4]", row);
                data.Sector = tempNode.Value;

                tempNode      = XPath.GetElement("/td[5]", row);
                data.Industry = tempNode.Value;
            }

            return(new TrefisCompanyCoveredInfoAggregate(dataList.ToArray()));
        }
コード例 #28
0
        /// <summary>
        /// Loads a list of default stock exchanges from market.xml
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static StockExchange[] GetDefaultStockExchanges()
        {
            List <StockExchange> lst = new List <StockExchange>();

            XParseDocument xmlDoc = MyHelper.ParseXmlDocument(Properties.Resources.market);

            XParseElement[] exchanges = XPath.GetElements("//Resources/StockExchanges/StockExchange", xmlDoc);

            foreach (XParseElement exchangeNode in exchanges)
            {
                string seID     = MyHelper.GetXmlAttributeValue(exchangeNode, "ID");
                string seSuffix = MyHelper.GetXmlAttributeValue(exchangeNode, "Suffix");
                string seName   = MyHelper.GetXmlAttributeValue(exchangeNode, "Name");

                CountryInfo seCountry = null;
                string      ctrID     = MyHelper.GetXmlAttributeValue(exchangeNode, "Country");
                foreach (CountryInfo ctr in DefaultCountries)
                {
                    if (ctr.ID.ToString() == ctrID)
                    {
                        seCountry = ctr;
                        break;
                    }
                }

                //TradingTimeInfo
                int      seDelayMinutes     = Convert.ToInt32(MyHelper.GetXmlAttributeValue(exchangeNode, "DelayMinutes"));
                int      seRelativeToUTC    = Convert.ToInt32(MyHelper.GetXmlAttributeValue(exchangeNode, "UtcOffsetStandardTime"));
                DateTime seOpeningTimeLocal = Convert.ToDateTime(MyHelper.GetXmlAttributeValue(exchangeNode, "OpeningTimeLocal"));
                DateTime seClosingTimeLocal = Convert.ToDateTime(MyHelper.GetXmlAttributeValue(exchangeNode, "ClosingTimeLocal"));
                TimeSpan seTradingSpan      = seClosingTimeLocal - seOpeningTimeLocal;

                List <DayOfWeek> seTradingDaysList = new List <DayOfWeek>();
                string           trdDays           = MyHelper.GetXmlAttributeValue(exchangeNode, "TradingDays");
                foreach (string day in trdDays.Split(','))
                {
                    switch (day)
                    {
                    case "Mo":
                        seTradingDaysList.Add(DayOfWeek.Monday);
                        break;

                    case "Tu":
                        seTradingDaysList.Add(DayOfWeek.Tuesday);
                        break;

                    case "We":
                        seTradingDaysList.Add(DayOfWeek.Wednesday);
                        break;

                    case "Th":
                        seTradingDaysList.Add(DayOfWeek.Thursday);
                        break;

                    case "Fr":
                        seTradingDaysList.Add(DayOfWeek.Friday);
                        break;

                    case "Sa":
                        seTradingDaysList.Add(DayOfWeek.Saturday);
                        break;

                    case "Su":
                        seTradingDaysList.Add(DayOfWeek.Sunday);
                        break;
                    }
                }

                DaylightSavingTime[] seDaylightSavingTimes = null;
                if (seCountry != null)
                {
                    seDaylightSavingTimes = seCountry.DaylightSavingTimes;
                }

                TradingTimeInfo seTradingTimeInfo = new TradingTimeInfo(seDelayMinutes, seTradingDaysList.ToArray(), null, seOpeningTimeLocal, seTradingSpan, seRelativeToUTC, seDaylightSavingTimes);

                StockExchange se = new StockExchange(seID, seSuffix, seName, seCountry, seTradingTimeInfo);
                string        s  = MyHelper.GetXmlAttributeValue(exchangeNode, "Tags");
                if (s != string.Empty)
                {
                    se.Tags.AddRange(s.Split(','));
                }
                lst.Add(se);
            }

            return(lst.ToArray());
        }
コード例 #29
0
        protected override IDSearchResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            IDSearchResult      result = null;
            List <IDSearchData> lst    = new List <IDSearchData>();

            if (stream != null)
            {
                if (settings is IDInstantSearchDownloadSettings)
                {
                    #region Instant
                    string          resultStr = MyHelper.StreamToString(stream, ((IDInstantSearchDownloadSettings)settings).TextEncoding);
                    MatchCollection results   = Regex.Matches(resultStr, "{\"symbol\":.*?}");
                    foreach (Match res in results)
                    {
                        string[] prp = res.Value.Replace("{", "").Replace("}", "").Split(',');
                        if (prp.Length > 0)
                        {
                            string name     = string.Empty;
                            string id       = string.Empty;
                            string category = string.Empty;
                            string exchange = string.Empty;
                            string type     = string.Empty;
                            foreach (string p in prp)
                            {
                                string[] kvp = p.Replace("\"", "").Split(':');
                                if (kvp.Length == 2)
                                {
                                    switch (kvp[0])
                                    {
                                    case "symbol":
                                        id = kvp[1].Trim();
                                        break;

                                    case "name":
                                        name = kvp[1].Trim();
                                        break;

                                    case "exch":
                                        exchange = kvp[1].Trim();
                                        break;

                                    case "type":
                                        switch (kvp[1].Trim())
                                        {
                                        case "S":
                                            type = "Stock";
                                            break;

                                        case "I":
                                            type = "Index";
                                            break;

                                        case "F":
                                            type = "Future";
                                            break;

                                        case "E":
                                            type = "ETF";
                                            break;

                                        case "M":
                                            type = "Fund";
                                            break;
                                        }
                                        break;
                                    }
                                }
                            }
                            lst.Add(new IDSearchData(name, id, type, exchange, string.Empty, null));
                        }
                    }
                    Dictionary <SecurityType, int> dict = new Dictionary <SecurityType, int>();
                    dict.Add(SecurityType.Any, lst.Count);
                    return(new IDSearchResult(lst.ToArray(), 0, lst.Count, lst.Count, dict));

                    #endregion
                }
                else if (settings is IDQuerySearchDownloadSettings)
                {
                    #region Query
                    IDQuerySearchDownloadSettings sett = (IDQuerySearchDownloadSettings)settings;

                    int pageingFrom = sett.ResultsIndex, pagingTo = sett.ResultsIndex + 20, overall = 0;
                    Dictionary <SecurityType, int> resultsCount  = new Dictionary <SecurityType, int>();

                    System.Globalization.CultureInfo convCulture = new System.Globalization.CultureInfo("en-US");
                    XParseDocument doc = MyHelper.ParseXmlDocument(stream);

                    XParseElement resultNode = XPath.GetElement("//div[@id=\"yfi_sym_lookup\"]", doc);
                    if (resultNode != null)
                    {
                        XParseElement navigationNode = XPath.GetElement("ul[1]", resultNode);
                        if (navigationNode != null)
                        {
                            string s;
                            int    t;


                            s = XPath.GetElement("li[1]/a/em", navigationNode).Value;
                            if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                            {
                                resultsCount.Add(SecurityType.Any, t);
                            }
                            s = XPath.GetElement("li[2]/a/em", navigationNode).Value;
                            if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                            {
                                resultsCount.Add(SecurityType.Stock, t);
                            }
                            s = XPath.GetElement("li[3]/a/em", navigationNode).Value;
                            if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                            {
                                resultsCount.Add(SecurityType.Fund, t);
                            }
                            s = XPath.GetElement("li[4]/a/em", navigationNode).Value;
                            if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                            {
                                resultsCount.Add(SecurityType.ETF, t);
                            }
                            s = XPath.GetElement("li[5]/a/em", navigationNode).Value;
                            if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                            {
                                resultsCount.Add(SecurityType.Index, t);
                            }
                            s = XPath.GetElement("li[6]/a/em", navigationNode).Value;
                            if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                            {
                                resultsCount.Add(SecurityType.Future, t);
                            }


                            if (MyHelper.EnumToArray(navigationNode.Elements()).Length == 7)
                            {
                                resultsCount.Add(SecurityType.Warrant, 0);
                                s = XPath.GetElement("li[7]/a/em", navigationNode).Value;
                                if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                                {
                                    resultsCount.Add(SecurityType.Currency, t);
                                }
                            }
                            else if (MyHelper.EnumToArray(navigationNode.Elements()).Length == 8)
                            {
                                s = XPath.GetElement("li[7]/a/em", navigationNode).Value;
                                if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                                {
                                    resultsCount.Add(SecurityType.Warrant, t);
                                }
                                s = XPath.GetElement("li[8]/a/em", navigationNode).Value;
                                if (int.TryParse(s.Substring(s.LastIndexOf("(") + 1).Replace(")", "").Trim(), out t))
                                {
                                    resultsCount.Add(SecurityType.Currency, t);
                                }
                            }
                        }

                        XParseElement contentNode = XPath.GetElement("div[1]", resultNode);
                        if (contentNode != null)
                        {
                            XParseElement tableNode     = XPath.GetElement("/div[1]/table", contentNode);
                            XParseElement tableHeadNode = XPath.GetElement("/thead/tr", tableNode);
                            XParseElement tableBodyNode = XPath.GetElement("/tbody", tableNode);

                            List <string> tableColumnNames = new List <string>();
                            tableColumnNames.Add("symbol");
                            tableColumnNames.Add("name");
                            bool hasISIN = XPath.GetElement("/th[3]", tableHeadNode).Value.ToLower().Contains("isin");
                            if (hasISIN)
                            {
                                tableColumnNames.Add("isin");
                            }
                            else
                            {
                                tableColumnNames.Add("lasttrade");
                            }
                            int l = MyHelper.EnumToArray(tableHeadNode.Elements()).Length;
                            for (int i = 3; i < l; i++)
                            {
                                if (hasISIN)
                                {
                                    switch (i)
                                    {
                                    case 3:
                                        tableColumnNames.Add("lasttrade");
                                        break;

                                    case 4:
                                        tableColumnNames.Add("type");
                                        break;

                                    case 5:
                                        tableColumnNames.Add("exchange");
                                        break;
                                    }
                                }
                                else
                                {
                                    string name = MyHelper.GetEnumItemAt(tableHeadNode.Elements(), i).Value.ToLower();
                                    if (name.Contains("type"))
                                    {
                                        tableColumnNames.Add("type");
                                    }
                                    else if (name.Contains("industry"))
                                    {
                                        tableColumnNames.Add("industry");
                                    }
                                    else if (name.Contains("exchange"))
                                    {
                                        tableColumnNames.Add("exchange");
                                    }
                                }
                            }


                            foreach (XParseElement rowNode in tableBodyNode.Elements())
                            {
                                IEnumerable <XParseElement> enm = rowNode.Elements();
                                if (MyHelper.EnumToArray(enm).Length >= tableColumnNames.Count)
                                {
                                    string name = string.Empty, id = string.Empty, type = string.Empty, industry = string.Empty, exchange = string.Empty;
                                    ISIN   isin = null;

                                    for (int i = 0; i < tableColumnNames.Count; i++)
                                    {
                                        switch (tableColumnNames[i])
                                        {
                                        case "symbol":
                                            id = MyHelper.GetEnumItemAt(enm, i).Value.Trim();
                                            break;

                                        case "name":
                                            name = MyHelper.GetEnumItemAt(enm, i).Value.Trim();
                                            break;

                                        case "isin":
                                            if (MyHelper.GetEnumItemAt(enm, i).Value.Trim() != string.Empty)
                                            {
                                                try
                                                {
                                                    isin = new ISIN(MyHelper.GetEnumItemAt(enm, i).Value.Trim());
                                                }
                                                catch { }
                                            }
                                            break;

                                        case "lasttrade":
                                            break;

                                        case "type":
                                            type = MyHelper.GetEnumItemAt(enm, i).Value.Trim();
                                            break;

                                        case "industry":
                                            industry = MyHelper.GetEnumItemAt(enm, i).Value.Trim();
                                            break;

                                        case "exchange":
                                            exchange = MyHelper.GetEnumItemAt(enm, i).Value.Trim();
                                            break;
                                        }
                                    }
                                    lst.Add(new IDSearchData(name, id, type, exchange, industry, isin));
                                }
                            }

                            overall = lst.Count;
                            XParseElement paginationNode = XPath.GetElement("//div[@id=\"pagination\"]", doc);
                            if (paginationNode != null)
                            {
                                PaginationScanner scn = new PaginationScanner();
                                scn.SetPagination(paginationNode.Value, out pageingFrom, out pagingTo, out overall);
                            }
                        }
                    }

                    result = new IDSearchResult(lst.ToArray(), pageingFrom, pagingTo, overall, resultsCount);
                    #endregion
                }
                else if (settings is IDAlphabeticSearchDownloadSettings)
                {
                    #region Alphabet
                    XParseDocument  doc          = MyHelper.ParseXmlDocument(stream);
                    XParseElement[] resultsNodes = XPath.GetElements("//results", doc);

                    if (resultsNodes.Length > 0)
                    {
                        XParseElement resultNode = resultsNodes[0];

                        foreach (XParseElement trNode in resultNode.Elements())
                        {
                            XParseElement[] enm = MyHelper.EnumToArray(trNode.Elements());
                            if (trNode.Name.LocalName == "tr" && enm.Length >= 2)
                            {
                                string name = string.Empty;
                                foreach (XParseElement subNode in enm[0].Elements())
                                {
                                    name += subNode.Value.Trim() + " ";
                                }
                                name = name.TrimEnd();
                                string id = enm[1].Value.Trim();
                                lst.Add(new IDSearchData(name, id, "stock", "", null, null));
                            }
                        }
                    }

                    result = new IDSearchResult(lst.ToArray(), -1, -1, -1, new Dictionary <SecurityType, int>());
                    #endregion
                }
            }
            if (result == null)
            {
                result = new IDSearchResult(lst.ToArray(), -1, -1, -1, new Dictionary <SecurityType, int>());
            }
            return(result);
        }
コード例 #30
0
        protected override CompanyProfileResult ConvertResult(Base.ConnectionInfo connInfo, System.IO.Stream stream, Base.SettingsBase settings)
        {
            CompanyProfileData res = null;

            System.Globalization.CultureInfo convCulture = new System.Globalization.CultureInfo("en-US");
            if (stream != null)
            {
                XParseDocument doc        = MyHelper.ParseXmlDocument(stream);
                XParseElement  resultNode = XPath.GetElement("//table[@id=\"yfncsumtab\"]/tr[2]", doc);

                if (resultNode != null)
                {
                    res = new CompanyProfileData();
                    res.SetID(FinanceHelper.CleanIndexID(((CompanyProfileDownloadSettings)settings).ID.ToUpper()));

                    XParseElement nameNode = XPath.GetElement("td[1]/b[1]", resultNode);
                    if (nameNode != null)
                    {
                        res.CompanyName = nameNode.Value;
                    }

                    XParseElement addressNode = XPath.GetElement("td[1]", resultNode);
                    if (addressNode != null)
                    {
                        System.Text.StringBuilder formattedAddress = new System.Text.StringBuilder();
                        try
                        {
                            string addNodeStr = addressNode.ToString();
                            if (addNodeStr != string.Empty)
                            {
                                addNodeStr = addNodeStr.Substring(addNodeStr.IndexOf("/>") + 2);
                                string[] rawAddress = addNodeStr.Substring(0, addNodeStr.IndexOf("Website")).Split(new string[] { "<b>", "<br />", "</b>", "\r", "\n", " - ", "</a>" }, StringSplitOptions.RemoveEmptyEntries);
                                if (rawAddress.Length >= 7)
                                {
                                    foreach (string line in rawAddress)
                                    {
                                        string l = line.Trim();
                                        if (l != string.Empty && !l.StartsWith("<a") && l != "Map")
                                        {
                                            formattedAddress.AppendLine(l);
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                        }
                        res.Address = formattedAddress.ToString().TrimEnd();
                    }

                    XParseElement indicesNode = XPath.GetElement("td[1]/table[2]/tr/td/table/tr/td[2]", resultNode);
                    if (indicesNode != null)
                    {
                        List <KeyValuePair <string, string> > lstIndices = new List <KeyValuePair <string, string> >();
                        foreach (XParseElement indexLink in indicesNode.Elements())
                        {
                            if (indexLink.Name.LocalName == "a")
                            {
                                string indexID = Uri.UnescapeDataString(MyHelper.GetXmlAttributeValue(indexLink, "href").ToUpper().Replace("HTTP://FINANCE.YAHOO.COM/Q?S=", "").Replace("&D=T", ""));
                                string name    = string.Empty;
                                foreach (string p in indexLink.Value.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                                {
                                    name += p.Trim() + " ";
                                }
                                lstIndices.Add(new KeyValuePair <string, string>(indexID, name.TrimEnd()));
                            }
                        }
                        res.Details.IndexMembership = lstIndices.ToArray();
                    }

                    XParseElement sectorsNode = XPath.GetElement("td[1]/table[2]/tr/td/table/tr[2]/td[2]", resultNode);
                    if (sectorsNode != null)
                    {
                        foreach (XParseElement sectorLink in sectorsNode.Elements())
                        {
                            if (sectorLink.Name.LocalName == "a")
                            {
                                foreach (Sector sect in Enum.GetValues(typeof(Sector)))
                                {
                                    string name = string.Empty;
                                    foreach (string p in sectorLink.Value.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                                    {
                                        name += p.Trim() + " ";
                                    }
                                    name = name.TrimEnd();
                                    if (sect.ToString().Replace("_", " ") == name)
                                    {
                                        res.Details.Sector = sect;
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    XParseElement industryNode = XPath.GetElement("td[1]/table[2]/tr/td/table/tr[3]/td[2]", resultNode);
                    if (industryNode != null)
                    {
                        foreach (XParseElement industryLink in industryNode.Elements())
                        {
                            if (industryLink.Name.LocalName == "a")
                            {
                                int indIndex = 0;
                                if (int.TryParse(MyHelper.GetXmlAttributeValue(industryLink, "href").Replace("http://biz.yahoo.com/ic/", "").Replace(".html", ""), out indIndex))
                                {
                                    res.Details.Industry = (Industry)indIndex;
                                }
                            }
                        }
                    }

                    XParseElement employeesNode = XPath.GetElement("td[1]/table[2]/tr/td/table/tr[4]/td[2]", resultNode);
                    if (employeesNode != null)
                    {
                        int fte;
                        if (int.TryParse(employeesNode.Value.Trim(), System.Globalization.NumberStyles.Any, convCulture, out fte))
                        {
                            res.Details.FullTimeEmployees = fte;
                        }
                    }

                    XParseElement summaryNode = XPath.GetElement("td[1]/p[1]", resultNode);
                    if (summaryNode != null)
                    {
                        System.Text.StringBuilder summaryText = new System.Text.StringBuilder();
                        foreach (string line in summaryNode.Value.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                        {
                            summaryText.Append(line.Trim() + " ");
                        }
                        res.BusinessSummary = summaryText.ToString().TrimEnd();
                    }

                    XParseElement websitesNodes = XPath.GetElement("td[1]/table[5]/tr/td", resultNode);
                    if (websitesNodes != null)
                    {
                        List <Uri> lstWebsites = new List <Uri>();
                        foreach (XParseElement linkNode in websitesNodes.Elements())
                        {
                            if (linkNode.Name.LocalName == "a")
                            {
                                lstWebsites.Add(new Uri(MyHelper.GetXmlAttributeValue(linkNode, "href")));
                            }
                        }
                        res.CompanyWebsites = lstWebsites.ToArray();
                    }



                    XParseElement governanceNode   = null;
                    XParseElement governanceHeader = XPath.GetElement("td[3]/table[1]/tr/th/span", resultNode);
                    if (governanceHeader != null && governanceHeader.Value.Contains("Governance"))
                    {
                        governanceNode = XPath.GetElement("td[3]/table[2]/tr/td", resultNode);
                    }
                    if (governanceNode != null)
                    {
                        System.Text.StringBuilder governanceText = new System.Text.StringBuilder();
                        foreach (string line in governanceNode.Value.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                        {
                            governanceText.Append(line.Trim() + " ");
                        }
                        res.CorporateGovernance = governanceText.ToString().TrimEnd();
                    }



                    XParseElement executivesNode   = null;
                    XParseElement executivesHeader = XPath.GetElement("td[3]/table[3]/tr/th/span", resultNode);
                    if (executivesHeader != null && executivesHeader.Value.Contains("Executives"))
                    {
                        executivesNode = XPath.GetElement("td[3]/table[4]/tr/td/table", resultNode);
                    }
                    else
                    {
                        executivesNode = XPath.GetElement("td[3]/table[2]/tr/td/table", resultNode);
                    }

                    if (executivesNode != null)
                    {
                        List <ExecutivePersonInfo> lst = new List <ExecutivePersonInfo>();
                        bool isFirst = true;
                        foreach (XParseElement row in executivesNode.Elements())
                        {
                            if (!isFirst)
                            {
                                if (row.Name.LocalName == "tr")
                                {
                                    XParseElement[] enm = MyHelper.EnumToArray(row.Elements());
                                    if (enm.Length >= 3)
                                    {
                                        ExecutivePersonInfo exec = new ExecutivePersonInfo();

                                        string name = string.Empty;

                                        foreach (string l in MyHelper.EnumToArray(enm[0].Elements())[0].Value.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                                        {
                                            name += l.Trim() + " ";
                                        }

                                        exec.Name = name.TrimEnd();

                                        string position = string.Empty;

                                        var enm2 = MyHelper.EnumToArray(enm[0].Elements());
                                        foreach (string l in enm2[enm2.Length - 1].Value.Split(new string[] { "\r\n" }, StringSplitOptions.None))
                                        {
                                            position += l.Trim() + " ";
                                        }

                                        exec.Position = position.Trim();


                                        string payStr = enm[1].Value.Replace("\r\n", "").Trim();
                                        if (!payStr.Contains("N/A"))
                                        {
                                            exec.Pay = FinanceHelper.GetMillionValue(payStr) * 1000000;
                                        }

                                        string exercisedStr = enm[2].Value.Replace("\r\n", "").Trim();
                                        if (!exercisedStr.Contains("N/A"))
                                        {
                                            double d = FinanceHelper.GetMillionValue(exercisedStr);
                                            exec.Exercised = (int)(d * 1000000);
                                        }

                                        lst.Add(exec);
                                    }
                                }
                            }
                            else
                            {
                                isFirst = false;
                            }
                        }
                        res.KeyExecutives = lst.ToArray();
                    }
                    if (res.BusinessSummary.StartsWith("There is no "))
                    {
                        res = null;
                    }
                }
            }

            return(new CompanyProfileResult(res));
        }