clsXMLParser.cs
上传用户:hkhxjs
上传日期:2008-11-25
资源大小:155k
文件大小:22k
源码类别:

Internet/网络编程

开发平台:

C#

  1. namespace WorkingWithXML
  2. {
  3.     using System; // Provides the basic functionality of .NET
  4. using System.Net; // Provides the net related functionality 
  5. using System.IO; // Provides the I/O functionality
  6. using System.Text; // Provides text based manipulations
  7. /// <summary>
  8. ///  Generic structure used for parsing the XML data
  9. ///  This structure composes of various sub structures
  10. ///  Each sub structure represents and XML request in whole
  11. ///  Every XML is parsed into its corresponding structure to 
  12. ///  fill its values TypeOfXMLRecieved() function of 
  13. ///  ServerCommunication class will determine that which structure
  14. ///  has to be filled
  15. /// </summary>
  16. public struct XMLSTRUCT
  17. {
  18. /// <summary>
  19. /// This structure is used store the parsed 
  20. /// values of the AUTH XML which is returned
  21. /// after login process
  22. /// </summary>
  23. public struct __AUTHENTICATION
  24. {
  25. /// <summary>
  26. /// Stores the Code value in it 0(successful)
  27. /// or 1(some error occured)
  28. /// </summary>
  29. public int iCode;
  30. /// <summary>
  31. /// This will stores the status of the login process
  32. /// and any error message if occured while login
  33. /// </summary>
  34. public string sStatus;
  35. /// <summary>
  36. /// This is used for cross checking the IP address
  37. /// which is send to the server that login is successful
  38. /// or not
  39. /// </summary>
  40. public string sIPAddress;
  41. }
  42. /// <summary>
  43. /// This structure is used to store the List of all 
  44. /// the Listeners from the server that are currently 
  45. /// The values are returned in the USERLIST response XML
  46. /// running
  47. /// </summary>
  48. public struct __USERLIST
  49. {
  50. /// <summary>
  51. /// Name by which the Listener has logged in
  52. /// </summary>
  53. public string sUsername;
  54. /// <summary>
  55. /// IP Address of that Listener
  56. /// </summary>
  57. public string sIPAddress;
  58. }
  59. /// <summary>
  60. /// This is use to store the values which are parsed
  61. /// from the SHOWFILES response XML from the Listener
  62. /// It containes the Files and Folders which are to 
  63. /// be shown to the user
  64. /// </summary>
  65. public struct __SHOWFILES
  66. {
  67. /// <summary>
  68. /// Stores the Filename or Folder name
  69. /// </summary>
  70. public string sFilename;
  71. /// <summary>
  72. /// Stores the FileSize, 0 in case of folders
  73. /// </summary>
  74. public int iFileSize;
  75. /// <summary>
  76. /// Mask stores the mask value of a file or folder
  77. /// 0(readonly file/folder) 1(read/write access)
  78. /// </summary>
  79. public int iMask;
  80. }
  81. /// <summary>
  82. /// In case of any Error an ERROR response XML is
  83. /// thrown from the Listener. The values are parsed into
  84. /// this structure
  85. /// </summary>
  86. public struct __ERROR
  87. {
  88. /// <summary>
  89. /// Stores the error code
  90. /// </summary>
  91. public int iErrCode;
  92. /// <summary>
  93. /// Stores the severity of the error
  94. /// Message or Warning or Error
  95. /// </summary>
  96. public string sSeverity;
  97. /// <summary>
  98. /// The actual error description is stored in this 
  99. /// variable
  100. /// </summary>
  101. public string sDescription;
  102. }
  103. /// <summary>
  104. /// no XML parser has been made for this structure, 
  105. /// since it is not used in this version
  106. /// </summary>
  107. public struct __UPDNLOAD
  108. {
  109. public string sFilename;
  110. public int iMask;
  111. }
  112. /// <summary>
  113. /// no XML parser has been made for this structure, 
  114. /// since it is not used in this version
  115. /// </summary>
  116. public struct __MESSAGE
  117. {
  118. public string sSenderName;
  119. public string sMessage;
  120. public string sIPAddress;
  121. }
  122. /// <summary>
  123. /// this structure stores the values from the 
  124. /// SERVERSEARCH XML that is returned by the Server
  125. /// as the result of search
  126. /// </summary>
  127. public struct __SERVERSEARCH
  128. {
  129. /// <summary>
  130. /// IP address of the machine where the file or folder
  131. /// is found
  132. /// </summary>
  133. public string  sIPAddress;
  134. /// <summary>
  135. /// Username i.e login name of the machine
  136. /// </summary>
  137. public string sUsername;
  138. /// <summary>
  139. /// Name of the file found for search criteria is
  140. /// in this variable
  141. /// </summary>
  142. public string sFilename;
  143. }
  144. /// <summary>
  145. /// Global varibales which are used
  146. /// in differents parts of the code
  147. /// for their specific structures
  148. /// </summary>
  149. public __AUTHENTICATION AUTH;
  150. public __USERLIST[] USERLIST;
  151. public __SHOWFILES[] SHOWFILES;
  152. public __SHOWFILES[] SEARCH;
  153. public __SERVERSEARCH[]     SERVERSEARCH;
  154. public __ERROR ERROR;
  155. public __MESSAGE MESSAGE;
  156. }
  157. /// <summary>
  158.     ///    Summary description for clsXMLParser.
  159.     ///    This class is used to parse any XML that is recieved
  160.     ///    by the Listener of Browser(Client)
  161.     ///    and stores the values to their corresponding
  162.     ///    structures so that the application could use them
  163.     /// </summary>
  164.   public class XMLParser
  165.     {
  166. /// <summary>
  167. /// Stores the Filename to write when login response
  168. /// when has arrived to the Browser
  169. /// </summary>
  170. public string LOGINXML;
  171. /// <summary>
  172. /// Stores the Filename to write when USERLIST response
  173. /// when has arrived to the Browser
  174. /// </summary>
  175. public string USERLISTXML;
  176. /// <summary>
  177. /// Stores the Filename to write when SERVERSEARCH response
  178. /// when has arrived to the Browser
  179. /// </summary>
  180. public string SERVERSEARCHRESULTXML;
  181. /// <summary>
  182. /// stores the number of tags that are found
  183. /// in the response XML
  184. /// </summary>
  185. protected int iTags;
  186. /// <summary>
  187. /// Used to store the counter that is how many time
  188. /// a loop is running 
  189. /// </summary>
  190. protected int iCounter;
  191. /// <summary>
  192. /// This document variable points to the XML documet
  193. /// </summary>
  194. protected MSXML2.IXMLDOMDocument document;
  195. /// <summary>
  196. /// Points to the element of the XML document
  197. /// </summary>
  198. protected MSXML2.IXMLDOMElement element;
  199. /// <summary>
  200. /// Points to the node of the XML 
  201. /// </summary>
  202. protected MSXML2.IXMLDOMNode node, ChildNode;
  203. /// <summary>
  204. /// points to the node list of the XML document
  205. /// Stores the node list of the XML
  206. /// </summary>
  207. protected MSXML2.IXMLDOMNodeList nodeList;
  208. /// <summary>
  209. /// Stores the node map of the XML document
  210. /// </summary>
  211. protected MSXML2.IXMLDOMNamedNodeMap nodeMap; 
  212. /// <summary>
  213. /// Default constructor
  214. /// </summary>
  215. public XMLParser()
  216.         {
  217.         }
  218. /// <summary>
  219. /// Initialize some important variables
  220. /// </summary>
  221. protected void InitVariables()
  222. {
  223. iTags=0;
  224. iCounter = 0;
  225. document = new MSXML2.DOMDocument();
  226. }
  227. /// <summary>
  228. /// This function is responsible for parsing the XML
  229. /// Actually this function will call the exact parse function
  230. /// depending upon the type of XML Recieved
  231. /// </summary>
  232. /// <param name="XMLFilename"> </param>
  233. /// <param name="outStruct"> </param>
  234. /// <param name="TagName"> </param>
  235. public int ParseXML(string XMLFilename, out XMLSTRUCT outStruct, string TagName)
  236. {
  237. // Declare and initializes the iElements to 0
  238. int iElements = 0;
  239. // Initializes the outStruct variable of this function
  240. // this structure is used to store the values of parsed XML
  241. outStruct = new XMLSTRUCT();
  242. // The following 12 lines of code checks the Type of XML recieved
  243. // and calls are made to there corresponding parser function
  244. // which actually are reponsible for parsing the XML
  245. // all the parse functions are user defined functions
  246. // the Number of Parsed records are stores in the iElements
  247. // variable which is returned by the function
  248. if( 0 == TagName.CompareTo("AUTH") ) 
  249. iElements = ParseAUTHXML(XMLFilename, out outStruct);
  250. else if( 0 == TagName.CompareTo("USERLIST") ) 
  251. iElements = ParseUSERLISTXML(XMLFilename, out outStruct);
  252. else if( 0 == TagName.CompareTo("SHOWFILES") ) 
  253. iElements = ParseSHOWFILESXML(XMLFilename, out outStruct);
  254. else if( 0 == TagName.CompareTo("SEARCH") ) 
  255. iElements = ParseSHOWFILESXML(XMLFilename, out outStruct);
  256. else if( 0 == TagName.CompareTo("ERROR") ) 
  257. iElements = ParseERRORXML(XMLFilename, out outStruct);
  258. else if( 0 == TagName.CompareTo("SERVERSEARCH") ) 
  259. iElements = ParseSERVERSEARCHXML(XMLFilename, out outStruct);
  260. else if( 0 == TagName.CompareTo("CHAT") ) 
  261. iElements = ParseCHATXML(XMLFilename, out outStruct);
  262. // Returns the iElements variable to the calling function
  263. return iElements;
  264. }
  265. protected int ParseCHATXML(string Filename, out XMLSTRUCT outStruct)
  266. {
  267. // initializes all the required variables
  268. InitVariables();
  269. // Initialize outStruct variable of this function
  270. outStruct = new XMLSTRUCT();
  271. // Process the XML document syncronously
  272. document.async = false;
  273. // load the xml document in memory for parsing
  274. if(document.load(Filename))
  275. {
  276. // get the first element of the XML
  277. element = document.documentElement; 
  278. // get the first child of the element
  279. node = element.firstChild;
  280. // extracts the node list present under the node
  281. nodeList = node.childNodes;
  282. // iTags will assigns to the number of nodes present
  283. // in node list
  284. iTags = nodeList.length;
  285. // Initialize the AUTH sructure of the outStruct
  286. // variable
  287. outStruct.MESSAGE = new XMLSTRUCT.__MESSAGE();
  288. // move the node to the next node of the nodelist
  289. node = nodeList.nextNode();
  290. // Extract each value from its specific node
  291. for(iCounter = 0; iCounter < iTags; iCounter++ )
  292. {
  293. // gets the attribute map that is how many attributes
  294. // are present in the node
  295. nodeMap = node.attributes;
  296. // extract the next node from the node map
  297. ChildNode = nodeMap.nextNode();
  298. // The following 9 lines of code will extract the 
  299. // various attribute values from the XML node
  300. // and fills it to the outStruct's corresponding
  301. // structure
  302. do
  303. {
  304. if( 0 == ChildNode.nodeName.CompareTo("sendername") )
  305. outStruct.MESSAGE.sSenderName = ChildNode.nodeValue.ToString();
  306. else if( 0 == ChildNode.nodeName.CompareTo("chatmsg") )
  307. outStruct.MESSAGE.sMessage = ChildNode.nodeValue.ToString();
  308. else if( 0 == ChildNode.nodeName.CompareTo("ip") )
  309. outStruct.MESSAGE.sIPAddress = ChildNode.nodeValue.ToString();
  310. } while( null != (ChildNode = nodeMap.nextNode()) );
  311. // now move to next node
  312. node = nodeList.nextNode();
  313. }
  314. }
  315. // Return the number of nodes parsed for the values
  316. return iCounter==iTags?iCounter:0;
  317. }
  318. /// <summary>
  319. /// Actual Parsing of AUTHENTICATION XML
  320. /// </summary>
  321. /// <param name="Filename"> </param>
  322. /// <param name="outStruct"> </param>
  323. protected int ParseAUTHXML(string Filename, out XMLSTRUCT outStruct)
  324. {
  325. // initializes all the required variables
  326. InitVariables();
  327. // Initialize outStruct variable of this function
  328. outStruct = new XMLSTRUCT();
  329. // Process the XML document syncronously
  330. document.async = false;
  331. // load the xml document in memory for parsing
  332. if(document.load(Filename))
  333. {
  334. // get the first element of the XML
  335. element = document.documentElement; 
  336. // get the first child of the element
  337. node = element.firstChild;
  338. // extracts the node list present under the node
  339. nodeList = node.childNodes;
  340. // iTags will assigns to the number of nodes present
  341. // in node list
  342. iTags = nodeList.length;
  343. // Initialize the AUTH sructure of the outStruct
  344. // variable
  345. outStruct.AUTH = new XMLSTRUCT.__AUTHENTICATION();
  346. // move the node to the next node of the nodelist
  347. node = nodeList.nextNode();
  348. // Extract each value from its specific node
  349. for(iCounter = 0; iCounter < iTags; iCounter++ )
  350. {
  351. // gets the attribute map that is how many attributes
  352. // are present in the node
  353. nodeMap = node.attributes;
  354. // extract the next node from the node map
  355. ChildNode = nodeMap.nextNode();
  356. // The following 9 lines of code will extract the 
  357. // various attribute values from the XML node
  358. // and fills it to the outStruct's corresponding
  359. // structure
  360. do
  361. {
  362. if( 0 == ChildNode.nodeName.CompareTo("code") )
  363. outStruct.AUTH.iCode =  Convert.ToInt32(ChildNode.nodeValue);
  364. else if( 0 == ChildNode.nodeName.CompareTo("status") )
  365. outStruct.AUTH.sStatus = ChildNode.nodeValue.ToString();
  366. else if( 0 == ChildNode.nodeName.CompareTo("ip") )
  367. outStruct.AUTH.sIPAddress = ChildNode.nodeValue.ToString();
  368. } while( null != (ChildNode = nodeMap.nextNode()) );
  369. // now move to next node
  370. node = nodeList.nextNode();
  371. }
  372. }
  373. // Return the number of nodes parsed for the values
  374. return iCounter==iTags?iCounter:0;
  375. }
  376. /// <summary>
  377. /// Actual Parsing of USERLIST XML
  378. /// </summary>
  379. /// <param name="Filename"> </param>
  380. /// <param name="outStruct"> </param>
  381. protected int ParseUSERLISTXML(string Filename, out XMLSTRUCT outStruct)
  382. {
  383. // initializes all the required variables
  384. InitVariables();
  385. // Initialize outStruct variable of this function
  386. outStruct = new XMLSTRUCT();
  387. // Process the XML document syncronously
  388. document.async = false;
  389. // load the xml document in memory for parsing
  390. if(document.load(Filename))
  391. {
  392. // get the first element of the XML
  393. element = document.documentElement; 
  394. // get the first child of the element
  395. node = element.firstChild;
  396. // extracts the node list present under the node
  397. nodeList = node.childNodes;
  398. // iTags will assigns to the number of nodes present
  399. // in node list
  400. iTags = nodeList.length;
  401. // Initialize the USERLIST sructure of the outStruct
  402. // variable
  403. outStruct.USERLIST = new XMLSTRUCT.__USERLIST[iTags];
  404. // move the node to the next node of the nodelist
  405. node = nodeList.nextNode();
  406. // Extract each value from its specific node
  407. for(iCounter = 0; iCounter < iTags; iCounter++ )
  408. {
  409. // gets the attribute map that is how many attributes
  410. // are present in the node
  411. nodeMap = node.attributes;
  412. // extract the next node from the node map
  413. ChildNode = nodeMap.nextNode();
  414. // The following 9 lines of code will extract the 
  415. // various attribute values from the XML node
  416. // and fills it to the outStruct's corresponding
  417. // structure
  418. do
  419. {
  420. if( 0 == ChildNode.nodeName.CompareTo("username") )
  421. outStruct.USERLIST[iCounter].sUsername = ChildNode.nodeValue.ToString();
  422. else if( 0 == ChildNode.nodeName.CompareTo("ip") )
  423. outStruct.USERLIST[iCounter].sIPAddress = ChildNode.nodeValue.ToString();
  424. } while( null != (ChildNode = nodeMap.nextNode()) );
  425. // now move to next node
  426. node = nodeList.nextNode();
  427. }
  428. }
  429. // Return the number of nodes parsed for the values
  430. return iCounter==iTags?iCounter:0;
  431. }
  432. /// <summary>
  433. /// Actual Parsing of SERVERSEARCH XML
  434. /// </summary>
  435. /// <param name="Filename"> </param>
  436. /// <param name="outStruct"> </param>
  437. protected int ParseSERVERSEARCHXML(string Filename, out XMLSTRUCT outStruct)
  438. {
  439. // initializes all the required variables
  440. InitVariables();
  441. // Initialize outStruct variable of this function
  442. outStruct = new XMLSTRUCT();
  443. // Process the XML document syncronously
  444. document.async = false;
  445. // load the xml document in memory for parsing
  446. if(document.load(Filename))
  447. {
  448. // get the first element of the XML
  449. element = document.documentElement; 
  450. // get the first child of the element
  451. node = element.firstChild;
  452. // extracts the node list present under the node
  453. nodeList = node.childNodes;
  454. // iTags will assigns to the number of nodes present
  455. // in node list
  456. iTags = nodeList.length;
  457. // Initialize the SERVERSEARCH sructure of the outStruct
  458. // variable
  459. outStruct.SERVERSEARCH = new XMLSTRUCT.__SERVERSEARCH[iTags];
  460. // move the node to the next node of the nodelist
  461. node = nodeList.nextNode();
  462. // Extract each value from its specific node
  463. for(iCounter = 0; iCounter < iTags; iCounter++ )
  464. {
  465. // gets the attribute map that is how many attributes
  466. // are present in the node
  467. nodeMap = node.attributes;
  468. // extract the next node from the node map
  469. ChildNode = nodeMap.nextNode();
  470. // The following 9 lines of code will extract the 
  471. // various attribute values from the XML node
  472. // and fills it to the outStruct's corresponding
  473. // structure
  474. do
  475. {
  476. if( 0 == ChildNode.nodeName.CompareTo("ip") )
  477. outStruct.SERVERSEARCH[iCounter].sIPAddress = ChildNode.nodeValue.ToString();
  478. else if( 0 == ChildNode.nodeName.CompareTo("username") )
  479. outStruct.SERVERSEARCH[iCounter].sUsername = ChildNode.nodeValue.ToString();
  480. else if( 0 == ChildNode.nodeName.CompareTo("filename") )
  481. outStruct.SERVERSEARCH[iCounter].sFilename = ChildNode.nodeValue.ToString();
  482. } while( null != (ChildNode = nodeMap.nextNode()) );
  483. // now move to next node
  484. node = nodeList.nextNode();
  485. }
  486. }
  487. // Return the number of nodes parsed for the values
  488. return iCounter==iTags?iCounter:0;
  489. }
  490. /// <summary>
  491. /// Actual Parsing of SHOWFILES XML
  492. /// </summary>
  493. /// <param name="Filename"> </param>
  494. /// <param name="outStruct"> </param>
  495. protected int ParseSHOWFILESXML(string Filename, out XMLSTRUCT outStruct)
  496. {
  497. // initializes all the required variables
  498. InitVariables();
  499. // Initialize outStruct variable of this function
  500. outStruct = new XMLSTRUCT();
  501. // Process the XML document syncronously
  502. document.async = false;
  503. // load the xml document in memory for parsing
  504. if(document.load(Filename))
  505. {
  506. // get the first element of the XML
  507. element = document.documentElement; 
  508. // get the first child of the element
  509. node = element.firstChild;
  510. // extracts the node list present under the node
  511. nodeList = node.childNodes;
  512. // iTags will assigns to the number of nodes present
  513. // in node list
  514. iTags = nodeList.length;
  515. // Initialize the SHOWFILES sructure of the outStruct
  516. // variable
  517. outStruct.SHOWFILES = new XMLSTRUCT.__SHOWFILES[iTags];
  518. // move the node to the next node of the nodelist
  519. node = nodeList.nextNode();
  520. // Extract each value from its specific node
  521. for(iCounter = 0; iCounter < iTags; iCounter++ )
  522. {
  523. // gets the attribute map that is how many attributes
  524. // are present in the node
  525. nodeMap = node.attributes;
  526. // extract the next node from the node map
  527. ChildNode = nodeMap.nextNode();
  528. // The following 9 lines of code will extract the 
  529. // various attribute values from the XML node
  530. // and fills it to the outStruct's corresponding
  531. // structure
  532. do
  533. {
  534. if( 0 == ChildNode.nodeName.CompareTo("filename") )
  535. outStruct.SHOWFILES[iCounter].sFilename = ChildNode.nodeValue.ToString();
  536. else if( 0 == ChildNode.nodeName.CompareTo("mask") )
  537. outStruct.SHOWFILES[iCounter].iMask =  Convert.ToInt32(ChildNode.nodeValue);
  538. else if( 0 == ChildNode.nodeName.CompareTo("filesize") )
  539. outStruct.SHOWFILES[iCounter].iFileSize =  Convert.ToInt32(ChildNode.nodeValue);
  540. } while( null != (ChildNode = nodeMap.nextNode()) );
  541. // now move to next node
  542. node = nodeList.nextNode();
  543. }
  544. }
  545. // Return the number of nodes parsed for the values
  546. return iCounter==iTags?iCounter:0;
  547. }
  548. /// <summary>
  549. /// Actual Parsing of ERROR XML
  550. /// </summary>
  551. /// <param name="Filename"> </param>
  552. /// <param name="outStruct"> </param>
  553. protected int ParseERRORXML(string Filename, out XMLSTRUCT outStruct)
  554. {
  555. // initializes all the required variables
  556. InitVariables();
  557. // Initialize outStruct variable of this function
  558. outStruct = new XMLSTRUCT();
  559. // Process the XML document syncronously
  560. document.async = false;
  561. // load the xml document in memory for parsing
  562. if(document.load(Filename))
  563. {
  564. // get the first element of the XML
  565. element = document.documentElement; 
  566. // get the first child of the element
  567. node = element.firstChild;
  568. // extracts the node list present under the node
  569. nodeList = node.childNodes;
  570. // iTags will assigns to the number of nodes present
  571. // in node list
  572. iTags = nodeList.length;
  573. // Initialize the ERROR sructure of the outStruct
  574. // variable
  575. outStruct.ERROR = new XMLSTRUCT.__ERROR();
  576. // move the node to the next node of the nodelist
  577. node = nodeList.nextNode();
  578. // Extract each value from its specific node
  579. for(iCounter = 0; iCounter < iTags; iCounter++ )
  580. {
  581. // gets the attribute map that is how many attributes
  582. // are present in the node
  583. nodeMap = node.attributes;
  584. // extract the next node from the node map
  585. ChildNode = nodeMap.nextNode();
  586. // The following 9 lines of code will extract the 
  587. // various attribute values from the XML node
  588. // and fills it to the outStruct's corresponding
  589. // structure
  590. do
  591. {
  592. if( 0 == ChildNode.nodeName.CompareTo("errorcode") )
  593. outStruct.ERROR.iErrCode = Convert.ToInt32(ChildNode.nodeValue);
  594. else if( 0 == ChildNode.nodeName.CompareTo("severity") )
  595. outStruct.ERROR.sSeverity = ChildNode.nodeValue.ToString();
  596. else if( 0 == ChildNode.nodeName.CompareTo("description") )
  597. outStruct.ERROR.sDescription = ChildNode.nodeValue.ToString();
  598. } while( null != (ChildNode = nodeMap.nextNode()) );
  599. // now move to next node
  600. node = nodeList.nextNode();
  601. }
  602. }
  603. // Return the number of nodes parsed for the values
  604. return iCounter==iTags?iCounter:0;
  605. }
  606.     }
  607. }