Parse.cs
上传用户:yxdanqu
上传日期:2010-01-07
资源大小:84k
文件大小:5k
源码类别:

搜索引擎

开发平台:

C#

  1. using System;
  2. namespace Spider
  3. {
  4. /// <summary>
  5. /// Base class for parseing tag based files, such as HTML, HTTP headers
  6. /// or XML.
  7. /// 
  8. /// 
  9. /// This spider is copyright 2003 by Jeff Heaton. However, it is
  10. /// released under a Limited GNU Public License (LGPL). You may 
  11. /// use it freely in your own programs. For the latest version visit
  12. /// http://www.jeffheaton.com.
  13. ///
  14. /// </summary>
  15. public class Parse:AttributeList 
  16. { /// <summary>
  17. /// The source text that is being parsed.
  18. /// </summary> private string m_source; /// <summary>
  19. /// The current position inside of the text that
  20. /// is being parsed.
  21. /// </summary> private int m_idx; /// <summary>
  22. /// The most reciently parsed attribute delimiter.
  23. /// </summary> private char m_parseDelim; /// <summary>
  24. /// This most receintly parsed attribute name.
  25. /// </summary> private string m_parseName; /// <summary>
  26. /// The most reciently parsed attribute value.
  27. /// </summary> private string m_parseValue; /// <summary>
  28. /// The most reciently parsed tag.
  29. /// </summary> public string m_tag; /// <summary>
  30. /// Determine if the specified character is whitespace or not.
  31. /// </summary>
  32. /// <param name="ch">A character to check</param>
  33. /// <returns>true if the character is whitespace</returns> public static bool IsWhiteSpace(char ch) { return( "tnr ".IndexOf(ch) != -1 ); } /// <summary>
  34. /// Advance the index until past any whitespace.
  35. /// </summary> public void EatWhiteSpace() { while ( !Eof() ) 
  36. { if ( !IsWhiteSpace(GetCurrentChar()) ) return; m_idx++; } } /// <summary>
  37. /// Determine if the end of the source text has been
  38. /// reached. 
  39. /// </summary>
  40. /// <returns>True if the end of the source text has been /// reached.</returns> public bool Eof() { return(m_idx>=m_source.Length ); } /// <summary>
  41. /// Parse the attribute name.
  42. /// </summary> public void ParseAttributeName() { EatWhiteSpace(); // get attribute name while ( !Eof() ) 
  43. { if ( IsWhiteSpace(GetCurrentChar()) || (GetCurrentChar()=='=') || (GetCurrentChar()=='>') ) break; m_parseName+=GetCurrentChar(); m_idx++; } EatWhiteSpace(); } /// <summary>
  44. /// Parse the attribute value
  45. /// </summary> public void ParseAttributeValue() { if ( m_parseDelim!=0 ) return; if ( GetCurrentChar()=='=' ) 
  46. { m_idx++; EatWhiteSpace(); if ( (GetCurrentChar()==''') || (GetCurrentChar()=='"') ) 
  47. { m_parseDelim = GetCurrentChar(); m_idx++; while ( GetCurrentChar()!=m_parseDelim ) 
  48. { m_parseValue+=GetCurrentChar(); m_idx++; } m_idx++; } 
  49. else 
  50. { while ( !Eof() && !IsWhiteSpace(GetCurrentChar()) && (GetCurrentChar()!='>') ) 
  51. { m_parseValue+=GetCurrentChar(); m_idx++; } } EatWhiteSpace(); } } /// <summary>
  52. /// Add a parsed attribute to the collection.
  53. /// </summary> public void AddAttribute() { Attribute a = new Attribute(m_parseName, m_parseValue,m_parseDelim); Add(a); }
  54. /// <summary>
  55. /// Get the current character that is being parsed.
  56. /// </summary>
  57. /// <returns></returns>
  58. public char GetCurrentChar()
  59. {
  60. return GetCurrentChar(0);
  61. }
  62. /// <summary>
  63. /// Get a few characters ahead of the current character.
  64. /// </summary>
  65. /// <param name="peek">How many characters to peek ahead for.</param>
  66. /// <returns>The character that was retrieved.</returns>
  67. public char GetCurrentChar(int peek)
  68. {
  69. if( (m_idx+peek)<m_source.Length )
  70. return m_source[m_idx+peek];
  71. else
  72. return (char)0;
  73. }
  74. /// <summary>
  75. /// Obtain the next character and advance the index by one.
  76. /// </summary>
  77. /// <returns>The next character</returns>
  78. public char AdvanceCurrentChar()
  79. {
  80. return m_source[m_idx++];
  81. }
  82. /// <summary>
  83. /// Move the index forward by one.
  84. /// </summary> public void Advance() { m_idx++; } /// <summary>
  85. /// The last attribute name that was encountered.
  86. /// </summary> public string ParseName { get  { return m_parseName; } set  { m_parseName = value; } } /// <summary>
  87. /// The last attribute value that was encountered.
  88. /// </summary> public string ParseValue { get  { return m_parseValue; } set  { m_parseValue = value; } } /// <summary>
  89. /// The last attribute delimeter that was encountered.
  90. /// </summary> public char ParseDelim { get  { return m_parseDelim; } set  { m_parseDelim = value; } } /// <summary>
  91. /// The text that is to be parsed.
  92. /// </summary> public string Source { get  { return m_source; } set  { m_source = value; } } }
  93. }