//#define XMLTV_PARSER_TESTING // when defined will allow calls to be made to _imp_TestParse() using System; using System.Collections.Generic; using System.Linq; using System.Text; using libxmltv.Interfaces; using System.Diagnostics; using System.Xml.Linq; namespace libxmltv.Core { internal class XMLTV_PARSER : IXMLTV_PARSER { public XMLTV_PARSER(object xmltv) { IXMLTV_LOADER _xmltv; if (!Internals.VerifyInstance(xmltv, out _xmltv)) { return; } XMLTV_LOADER = _xmltv; Create(); } #region IXMLTV_PARSER members public IXMLTV_LOADER XMLTV_LOADER { get; private set; } public void TestParse() { _imp_TestParse(); } public IXMLTVSource Source { get; private set; } public Dictionary Channels { get; private set; } #endregion #region Parser Testing Methods [Conditional("XMLTV_PARSER_TESTING")] private void _imp_TestParse() { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("Running XML_PARSER Test"); var doc = XMLTV_LOADER.XmlDoc; ParseRootElements(doc); ParseChannels(doc); ParsePrograms(doc); } [Conditional("XMLTV_PARSER_TESTING")] private void ParseRootElements(XDocument doc) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("Parseing Root Data"); Debug.Assert(doc.Root.Name == XMLTV_CONSTANTS.ROOT_ELEMENT, string.Format("Expected Root Element: '{0}' but read: '{1}'", XMLTV_CONSTANTS.ROOT_ELEMENT, doc.Root.Name)); XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\tRoot: {0}", doc.Root.Name); var attributes = doc.Root.Attributes().ToList(); foreach (var attribute in attributes) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t{0}: {1}", attribute.Name, attribute.Value); } } [Conditional("XMLTV_PARSER_TESTING")] private void ParseChannels(XDocument doc) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("Parsing Channel Data"); var elements = doc.Root.Descendants(XMLTV_CONSTANTS.CHANNEL_ELEMENT).ToList(); foreach (var element in elements) { if (element.HasAttributes) { foreach (var attribute in element.Attributes()) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t\t{0} {1}: {2}",element.Name, attribute.Name, attribute.Value); } } foreach (var childEllement in element.Descendants()) { if (childEllement.HasAttributes) { foreach (var attribute in childEllement.Attributes()) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t\t\t{0}: {1}", attribute.Name, attribute.Value); } } XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t\t\t{0}: {1}", childEllement.Name, childEllement.Value); } } } [Conditional("XMLTV_PARSER_TESTING")] private void ParsePrograms(XDocument doc) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("Parsing Program Data"); var elements = doc.Root.Descendants(XMLTV_CONSTANTS.PROGRAM_ELEMENT).ToList(); foreach (var element in elements) { if (element.HasAttributes) { foreach (var attribute in element.Attributes()) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t\t{0} {1}: {2}", element.Name, attribute.Name, attribute.Value); } } foreach (var childEllement in element.Descendants()) { if (childEllement.HasAttributes) { foreach (var attribute in childEllement.Attributes()) { XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t\t\t{0}: {1}", attribute.Name, attribute.Value); } } XMLTV_LOGGER.Log.Verbose.Debug.WriteLine("\t\t\t{0}: {1}", childEllement.Name, childEllement.Value); } //break; } } #endregion #region Creation Methods private void Create() { CreateXMLTVSource(); CreateXMLTVChannels(); } private void CreateXMLTVSource() { XMLTVSource source = new XMLTVSource(this); Source = source; } private void CreateXMLTVChannels() { XMLTVChannelCollection channels = new XMLTVChannelCollection(this); Channels = channels.Collection; } #endregion } }