XParse.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:5k
源码类别:

搜索引擎

开发平台:

C#

  1. using System;
  2. namespace HTMParse
  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. {
  17. /// <summary>
  18. /// The source text that is being parsed.
  19. /// </summary>
  20. private string m_source;
  21. /// <summary>
  22. /// The current position inside of the text that
  23. /// is being parsed.
  24. /// </summary>
  25. private int m_idx;
  26. /// <summary>
  27. /// The most reciently parsed attribute delimiter.
  28. /// </summary>
  29. private char m_parseDelim;
  30. /// <summary>
  31. /// This most receintly parsed attribute name.
  32. /// </summary>
  33. private string m_parseName;
  34. /// <summary>
  35. /// The most reciently parsed attribute value.
  36. /// </summary>
  37. private string m_parseValue;
  38. /// <summary>
  39. /// The most reciently parsed tag.
  40. /// </summary>
  41. public string m_tag;
  42. /// <summary>
  43. /// Determine if the specified character is whitespace or not.
  44. /// </summary>
  45. /// <param name="ch">A character to check</param>
  46. /// <returns>true if the character is whitespace</returns>
  47. public static bool IsWhiteSpace(char ch)
  48. {
  49. return( "tnr ".IndexOf(ch) != -1 );
  50. }
  51. /// <summary>
  52. /// Advance the index until past any whitespace.
  53. /// </summary>
  54. public void EatWhiteSpace()
  55. {
  56. while ( !Eof() ) 
  57. {
  58. if ( !IsWhiteSpace(GetCurrentChar()) )
  59. return;
  60. m_idx++;
  61. }
  62. }
  63. /// <summary>
  64. /// Determine if the end of the source text has been
  65. /// reached. 
  66. /// </summary>
  67. /// <returns>True if the end of the source text has been
  68. /// reached.</returns>
  69. public bool Eof()
  70. {
  71. return(m_idx>=m_source.Length );
  72. }
  73. /// <summary>
  74. /// Parse the attribute name.
  75. /// </summary>
  76. public void ParseAttributeName()
  77. {
  78. EatWhiteSpace();
  79. // get attribute name
  80. while ( !Eof() ) 
  81. {
  82. if ( IsWhiteSpace(GetCurrentChar()) ||
  83. (GetCurrentChar()=='=') ||
  84. (GetCurrentChar()=='>') )
  85. break;
  86. m_parseName+=GetCurrentChar();
  87. m_idx++;
  88. }
  89. EatWhiteSpace();
  90. }
  91. /// <summary>
  92. /// Parse the attribute value
  93. /// </summary>
  94. public void ParseAttributeValue()
  95. {
  96. if ( m_parseDelim!=0 )
  97. return;
  98. if ( GetCurrentChar()=='=' ) 
  99. {
  100. m_idx++;
  101. EatWhiteSpace();
  102. if ( (GetCurrentChar()==''') ||
  103. (GetCurrentChar()=='"') ) 
  104. {
  105. m_parseDelim = GetCurrentChar();
  106. m_idx++;
  107. while (( GetCurrentChar()!=m_parseDelim ) &&(m_idx<900000))
  108. {
  109. m_parseValue+=GetCurrentChar();
  110. m_idx++;
  111. }
  112. m_idx++;
  113. else 
  114. {
  115. while (( !Eof() &&
  116. !IsWhiteSpace(GetCurrentChar()) &&
  117. (GetCurrentChar()!='>') ) &&(m_idx<2000))
  118. {
  119. m_parseValue+=GetCurrentChar();
  120. m_idx++;
  121. }
  122. }
  123. EatWhiteSpace();
  124. }
  125. }
  126. /// <summary>
  127. /// Add a parsed attribute to the collection.
  128. /// </summary>
  129. public void AddAttribute()
  130. {
  131. Attribute a = new Attribute(m_parseName,
  132. m_parseValue,m_parseDelim);
  133. Add(a);
  134. }
  135. /// <summary>
  136. /// Get the current character that is being parsed.
  137. /// </summary>
  138. /// <returns></returns>
  139. public char GetCurrentChar()
  140. {
  141. return GetCurrentChar(0);
  142. }
  143. /// <summary>
  144. /// Get a few characters ahead of the current character.
  145. /// </summary>
  146. /// <param name="peek">How many characters to peek ahead for.</param>
  147. /// <returns>The character that was retrieved.</returns>
  148. public char GetCurrentChar(int peek)
  149. {
  150. if( (m_idx+peek)<m_source.Length )
  151. return m_source[m_idx+peek];
  152. else
  153. return (char)0;
  154. }
  155. /// <summary>
  156. /// Obtain the next character and advance the index by one.
  157. /// </summary>
  158. /// <returns>The next character</returns>
  159. public char AdvanceCurrentChar()
  160. {
  161. return m_source[m_idx++];
  162. }
  163. /// <summary>
  164. /// Move the index forward by one.
  165. /// </summary>
  166. public void Advance()
  167. {
  168. m_idx++;
  169. }
  170. /// <summary>
  171. /// The last attribute name that was encountered.
  172. /// </summary>
  173. public string ParseName
  174. {
  175. get 
  176. {
  177. return m_parseName;
  178. }
  179. set 
  180. {
  181. m_parseName = value;
  182. }
  183. }
  184. /// <summary>
  185. /// The last attribute value that was encountered.
  186. /// </summary>
  187. public string ParseValue
  188. {
  189. get 
  190. {
  191. return m_parseValue;
  192. }
  193. set 
  194. {
  195. m_parseValue = value;
  196. }
  197. }
  198. /// <summary>
  199. /// The last attribute delimeter that was encountered.
  200. /// </summary>
  201. public char ParseDelim
  202. {
  203. get 
  204. {
  205. return m_parseDelim;
  206. }
  207. set 
  208. {
  209. m_parseDelim = value;
  210. }
  211. }
  212. /// <summary>
  213. /// The text that is to be parsed.
  214. /// </summary>
  215. public string Source
  216. {
  217. get 
  218. {
  219. return m_source;
  220. }
  221. set 
  222. {
  223. m_source = value;
  224. }
  225. }
  226. }
  227. }