SAX2Count.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:12k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  5. * reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. *    notice, this list of conditions and the following disclaimer.
  13. *
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. *    notice, this list of conditions and the following disclaimer in
  16. *    the documentation and/or other materials provided with the
  17. *    distribution.
  18. *
  19. * 3. The end-user documentation included with the redistribution,
  20. *    if any, must include the following acknowledgment:
  21. *       "This product includes software developed by the
  22. *        Apache Software Foundation (http://www.apache.org/)."
  23. *    Alternately, this acknowledgment may appear in the software itself,
  24. *    if and wherever such third-party acknowledgments normally appear.
  25. *
  26. * 4. The names "Xerces" and "Apache Software Foundation" must
  27. *    not be used to endorse or promote products derived from this
  28. *    software without prior written permission. For written
  29. *    permission, please contact apache@apache.org.
  30. *
  31. * 5. Products derived from this software may not be called "Apache",
  32. *    nor may "Apache" appear in their name, without prior written
  33. *    permission of the Apache Software Foundation.
  34. *
  35. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38. * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46. * SUCH DAMAGE.
  47. * ====================================================================
  48. *
  49. * This software consists of voluntary contributions made by many
  50. * individuals on behalf of the Apache Software Foundation, and was
  51. * originally based on software copyright (c) 1999, International
  52. * Business Machines, Inc., http://www.ibm.com .  For more information
  53. * on the Apache Software Foundation, please see
  54. * <http://www.apache.org/>.
  55. */
  56. /*
  57. * $Log: SAX2Count.cpp,v $
  58. * Revision 1.13  2001/10/29 17:02:57  tng
  59. * Fix typo in samples.
  60. *
  61. * Revision 1.12  2001/10/25 15:18:33  tng
  62. * delete the parser before XMLPlatformUtils::Terminate.
  63. *
  64. * Revision 1.11  2001/10/19 19:02:43  tng
  65. * [Bug 3909] return non-zero an exit code when error was encounted.
  66. * And other modification for consistent help display and return code across samples.
  67. *
  68. * Revision 1.10  2001/08/15 12:41:04  tng
  69. * Initialize the fURI array to zeros, in case, some compilers like AIX xlC_r doesn't reset the memory.
  70. *
  71. * Revision 1.9  2001/08/08 12:12:32  tng
  72. * Print the file name only if doList is on.
  73. *
  74. * Revision 1.8  2001/08/03 15:08:17  tng
  75. * close the list file.
  76. *
  77. * Revision 1.7  2001/08/02 17:10:29  tng
  78. * Allow DOMCount/SAXCount/IDOMCount/SAX2Count to take a file that has a list of xml file as input.
  79. *
  80. * Revision 1.6  2001/08/01 19:11:01  tng
  81. * Add full schema constraint checking flag to the samples and the parser.
  82. *
  83. * Revision 1.5  2001/05/11 13:24:56  tng
  84. * Copyright update.
  85. *
  86. * Revision 1.4  2001/05/03 15:59:55  tng
  87. * Schema: samples update with schema
  88. *
  89. * Revision 1.3  2000/08/09 22:46:06  jpolast
  90. * replace occurences of SAXCount with SAX2Count
  91. *
  92. * Revision 1.2  2000/08/09 22:40:15  jpolast
  93. * updates for changes to sax2 core functionality.
  94. *
  95. * Revision 1.1  2000/08/08 17:17:20  jpolast
  96. * initial checkin of SAX2Count
  97. *
  98. *
  99. */
  100. // ---------------------------------------------------------------------------
  101. //  Includes
  102. // ---------------------------------------------------------------------------
  103. #include "SAX2Count.hpp"
  104. #include <util/PlatformUtils.hpp>
  105. #include <sax2/SAX2XMLReader.hpp>
  106. #include <sax2/XMLReaderFactory.hpp>
  107. #include <fstream.h>
  108. // ---------------------------------------------------------------------------
  109. //  Local helper methods
  110. // ---------------------------------------------------------------------------
  111. void usage()
  112. {
  113.     cout << "nUsage:n"
  114.             "    SAX2Count [options] <XML file | List file>nn"
  115.             "This program invokes the SAX2XMLReader, and then prints then"
  116.             "number of elements, attributes, spaces and characters foundn"
  117.             "in each XML file, using SAX2 API.nn"
  118.             "Options:n"
  119.             "    -l          Indicate the input file is a List File that has a list of xml files.n"
  120.             "                Default to off (Input file is an XML file).n"
  121.             "    -v=xxx      Validation scheme [always | never | auto*].n"
  122.             "    -f          Enable full schema constraint checking processing. Defaults to off.n"
  123.             "    -n          Disable namespace processing. Defaults to on.n"
  124.             "                NOTE: THIS IS OPPOSITE FROM OTHER SAMPLES.n"
  125.             "    -s          Disable schema processing. Defaults to on.n"
  126.             "                NOTE: THIS IS OPPOSITE FROM OTHER SAMPLES.n"
  127.       "    -?          Show this help.nn"
  128.             "  * = Default if not provided explicitly.n"
  129.          << endl;
  130. }
  131. // ---------------------------------------------------------------------------
  132. //  Program entry point
  133. // ---------------------------------------------------------------------------
  134. int main(int argC, char* argV[])
  135. {
  136.     // Initialize the XML4C2 system
  137.     try
  138.     {
  139.         XMLPlatformUtils::Initialize();
  140.     }
  141.     catch (const XMLException& toCatch)
  142.     {
  143.         cerr << "Error during initialization! Message:n"
  144.             << StrX(toCatch.getMessage()) << endl;
  145.         return 1;
  146.     }
  147.     // Check command line and extract arguments.
  148.     if (argC < 2)
  149.     {
  150.         usage();
  151.         XMLPlatformUtils::Terminate();
  152.         return 1;
  153.     }
  154.     const char*                  xmlFile      = 0;
  155.     SAX2XMLReader::ValSchemes    valScheme    = SAX2XMLReader::Val_Auto;
  156.     bool                         doNamespaces = true;
  157.     bool                         doSchema = true;
  158.     bool                         schemaFullChecking = false;
  159.     bool                         doList = false;
  160.     bool                         errorOccurred = false;
  161.     int argInd;
  162.     for (argInd = 1; argInd < argC; argInd++)
  163.     {
  164.         // Break out on first parm not starting with a dash
  165.         if (argV[argInd][0] != '-')
  166.             break;
  167.         // Watch for special case help request
  168.         if (!strcmp(argV[argInd], "-?"))
  169.         {
  170.             usage();
  171.             XMLPlatformUtils::Terminate();
  172.             return 2;
  173.         }
  174.          else if (!strncmp(argV[argInd], "-v=", 3)
  175.               ||  !strncmp(argV[argInd], "-V=", 3))
  176.         {
  177.             const char* const parm = &argV[argInd][3];
  178.             if (!strcmp(parm, "never"))
  179.                 valScheme = SAX2XMLReader::Val_Never;
  180.             else if (!strcmp(parm, "auto"))
  181.                 valScheme = SAX2XMLReader::Val_Auto;
  182.             else if (!strcmp(parm, "always"))
  183.                 valScheme = SAX2XMLReader::Val_Always;
  184.             else
  185.             {
  186.                 cerr << "Unknown -v= value: " << parm << endl;
  187.                 XMLPlatformUtils::Terminate();
  188.                 return 2;
  189.             }
  190.         }
  191.          else if (!strcmp(argV[argInd], "-n")
  192.               ||  !strcmp(argV[argInd], "-N"))
  193.         {
  194.             doNamespaces = false;
  195.         }
  196.          else if (!strcmp(argV[argInd], "-s")
  197.               ||  !strcmp(argV[argInd], "-S"))
  198.         {
  199.             doSchema = false;
  200.         }
  201.          else if (!strcmp(argV[argInd], "-f")
  202.               ||  !strcmp(argV[argInd], "-F"))
  203.         {
  204.             schemaFullChecking = true;
  205.         }
  206.          else if (!strcmp(argV[argInd], "-l")
  207.               ||  !strcmp(argV[argInd], "-L"))
  208.         {
  209.             doList = true;
  210.         }
  211.         else
  212.         {
  213.             cerr << "Unknown option '" << argV[argInd]
  214.                 << "', ignoring itn" << endl;
  215.         }
  216.     }
  217.     //
  218.     //  There should be only one and only one parameter left, and that
  219.     //  should be the file name.
  220.     //
  221.     if (argInd != argC - 1)
  222.     {
  223.         usage();
  224.         XMLPlatformUtils::Terminate();
  225.         return 1;
  226.     }
  227.     //
  228.     //  Create a SAX parser object. Then, according to what we were told on
  229.     //  the command line, set it to validate or not.
  230.     //
  231.     SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
  232.     parser->setFeature(XMLString::transcode("http://xml.org/sax/features/namespaces"), doNamespaces);
  233.     parser->setFeature(XMLString::transcode("http://apache.org/xml/features/validation/schema"), doSchema);
  234.     parser->setFeature(XMLString::transcode("http://apache.org/xml/features/validation/schema-full-checking"), schemaFullChecking);
  235.     if (valScheme == SAX2XMLReader::Val_Auto)
  236.     {
  237.         parser->setFeature(XMLString::transcode("http://xml.org/sax/features/validation"), true);
  238.         parser->setFeature(XMLString::transcode("http://apache.org/xml/features/validation/dynamic"), true);
  239.     }
  240.     if (valScheme == SAX2XMLReader::Val_Never)
  241.     {
  242.         parser->setFeature(XMLString::transcode("http://xml.org/sax/features/validation"), false);
  243.     }
  244.     if (valScheme == SAX2XMLReader::Val_Always)
  245.     {
  246.         parser->setFeature(XMLString::transcode("http://xml.org/sax/features/validation"), true);
  247.         parser->setFeature(XMLString::transcode("http://apache.org/xml/features/validation/dynamic"), false);
  248.     }
  249.     //
  250.     //  Create our SAX handler object and install it on the parser, as the
  251.     //  document and error handler.
  252.     //
  253.     SAX2CountHandlers handler;
  254.     parser->setContentHandler(&handler);
  255.     parser->setErrorHandler(&handler);
  256.     //
  257.     //  Get the starting time and kick off the parse of the indicated
  258.     //  file. Catch any exceptions that might propogate out of it.
  259.     //
  260.     unsigned long duration;
  261.     bool more = true;
  262.     ifstream fin;
  263.     // the input is a list file
  264.     if (doList)
  265.         fin.open(argV[argInd]);
  266.     while (more)
  267.     {
  268.         char fURI[1000];
  269.         //initialize the array to zeros
  270.         memset(fURI,0,sizeof(fURI));
  271.         if (doList) {
  272.             if (! fin.eof() ) {
  273.                 fin.getline (fURI, sizeof(fURI));
  274.                 if (!*fURI)
  275.                     continue;
  276.                 else {
  277.                     xmlFile = fURI;
  278.                     cerr << "==Parsing== " << xmlFile << endl;
  279.                 }
  280.             }
  281.             else
  282.                 break;
  283.         }
  284.         else {
  285.             xmlFile = argV[argInd];
  286.             more = false;
  287.         }
  288.         //reset error count first
  289.         handler.resetErrors();
  290.         try
  291.         {
  292.             const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
  293.             parser->parse(xmlFile);
  294.             const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
  295.             duration = endMillis - startMillis;
  296.         }
  297.         catch (const XMLException& e)
  298.         {
  299.             cerr << "nError during parsing: '" << xmlFile << "'n"
  300.                 << "Exception message is:  n"
  301.                 << StrX(e.getMessage()) << "n" << endl;
  302.             errorOccurred = true;
  303.             continue;
  304.         }
  305.         catch (...)
  306.         {
  307.             cerr << "nUnexpected exception during parsing: '" << xmlFile << "'n";
  308.             errorOccurred = true;
  309.             continue;
  310.         }
  311.         // Print out the stats that we collected and time taken
  312.         if (!handler.getSawErrors())
  313.         {
  314.             cout << xmlFile << ": " << duration << " ms ("
  315.                 << handler.getElementCount() << " elems, "
  316.                 << handler.getAttrCount() << " attrs, "
  317.                 << handler.getSpaceCount() << " spaces, "
  318.                 << handler.getCharacterCount() << " chars)" << endl;
  319.         }
  320.         else
  321.             errorOccurred = true;
  322.     }
  323.     if (doList)
  324.         fin.close();
  325.     //
  326.     //  Delete the parser itself.  Must be done prior to calling Terminate, below.
  327.     //
  328.     delete parser;
  329.     // And call the termination method
  330.     XMLPlatformUtils::Terminate();
  331.     if (errorOccurred)
  332.         return 4;
  333.     else
  334.         return 0;
  335. }