DOMPrint.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:21k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2002 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.  * $Id: DOMPrint.cpp,v 1.57 2003/04/27 18:08:29 jberry Exp $
  58.  */
  59. // ---------------------------------------------------------------------------
  60. //  This sample program invokes the XercesDOMParser to build a DOM tree for
  61. //  the specified input file. It then invokes DOMWriter::writeNode() to
  62. //  serialize the resultant DOM tree back to XML stream.
  63. //
  64. //  Note:
  65. //  Application needs to provide its own implementation of
  66. //    DOMErrorHandler (in this sample, the DOMPrintErrorHandler),
  67. //    if it would like to receive notification from the serializer
  68. //    in the case any error occurs during the serialization.
  69. //
  70. //  Application needs to provide its own implementation of
  71. //    DOMWriterFilter (in this sample, the DOMPrintFilter),
  72. //    if it would like to filter out certain part of the DOM
  73. //    representation, but must be aware that thus may render the
  74. //    resultant XML stream invalid.
  75. //
  76. //  Application may choose any combination of characters as the
  77. //    end of line sequence to be used in the resultant XML stream,
  78. //    but must be aware that thus may render the resultant XML
  79. //    stream ill formed.
  80. //
  81. //  Application may choose a particular encoding name in which
  82. //    the output XML stream would be, but must be aware that if
  83. //    characters, unrepresentable in the encoding specified, appearing
  84. //    in markups, may force the serializer to terminate serialization
  85. //    prematurely, and thus no complete serialization would be done.
  86. //
  87. //  Application shall query the serializer first, before set any
  88. //           feature/mode(true, false), or be ready to catch exception if this
  89. //           feature/mode is not supported by the serializer.
  90. //
  91. //  Application needs to clean up the filter, error handler and
  92. //    format target objects created for the serialization.
  93. //
  94. //   Limitations:
  95. //      1.  The encoding="xxx" clause in the XML header should reflect
  96. //          the system local code page, but does not.
  97. //      2.  Cases where the XML data contains characters that can not
  98. //          be represented in the system local code page are not handled.
  99. //
  100. // ---------------------------------------------------------------------------
  101. // ---------------------------------------------------------------------------
  102. //  Includes
  103. // ---------------------------------------------------------------------------
  104. #include <xercesc/util/PlatformUtils.hpp>
  105. #include <xercesc/dom/DOM.hpp>
  106. #include <xercesc/dom/DOMImplementation.hpp>
  107. #include <xercesc/dom/DOMImplementationLS.hpp>
  108. #include <xercesc/dom/DOMWriter.hpp>
  109. #include <xercesc/framework/StdOutFormatTarget.hpp>
  110. #include <xercesc/framework/LocalFileFormatTarget.hpp>
  111. #include <xercesc/parsers/XercesDOMParser.hpp>
  112. #include <xercesc/util/XMLUni.hpp>
  113. #include "DOMTreeErrorReporter.hpp"
  114. #include "DOMPrintFilter.hpp"
  115. #include "DOMPrintErrorHandler.hpp"
  116. #include <string.h>
  117. #include <stdlib.h>
  118. // ---------------------------------------------------------------------------
  119. //  Local data
  120. //
  121. //  gXmlFile
  122. //      The path to the file to parser. Set via command line.
  123. //
  124. //  gDoNamespaces
  125. //      Indicates whether namespace processing should be done.
  126. //
  127. //  gDoSchema
  128. //      Indicates whether schema processing should be done.
  129. //
  130. //  gSchemaFullChecking
  131. //      Indicates whether full schema constraint checking should be done.
  132. //
  133. //  gDoCreate
  134. //      Indicates whether entity reference nodes needs to be created or not
  135. //      Defaults to false
  136. //
  137. //  gOutputEncoding
  138. //      The encoding we are to output in. If not set on the command line,
  139. //      then it is defaults to the encoding of the input XML file.
  140. //
  141. //  gSplitCdataSections
  142. //      Indicates whether split-cdata-sections is to be enabled or not.
  143. //
  144. //  gDiscardDefaultContent
  145. //      Indicates whether default content is discarded or not.
  146. //
  147. //  gUseFilter
  148. //      Indicates if user wants to plug in the DOMPrintFilter.
  149. //
  150. //  gValScheme
  151. //      Indicates what validation scheme to use. It defaults to 'auto', but
  152. //      can be set via the -v= command.
  153. //
  154. // ---------------------------------------------------------------------------
  155. static char*                    gXmlFile               = 0;
  156. static bool                     gDoNamespaces          = false;
  157. static bool                     gDoSchema              = false;
  158. static bool                     gSchemaFullChecking    = false;
  159. static bool                     gDoCreate              = false;
  160. static char*                    goutputfile            = 0;
  161. // options for DOMWriter's features
  162. static XMLCh*                   gOutputEncoding        = 0;
  163. static bool                     gSplitCdataSections    = true;
  164. static bool                     gDiscardDefaultContent = true;
  165. static bool                     gUseFilter             = false;
  166. static bool                     gFormatPrettyPrint     = false;
  167. static bool                     gWriteBOM              = false;
  168. static XercesDOMParser::ValSchemes    gValScheme       = XercesDOMParser::Val_Auto;
  169. // Prototypes for internally used functions
  170. void usage();
  171. // ---------------------------------------------------------------------------
  172. //
  173. //  Usage()
  174. //
  175. // ---------------------------------------------------------------------------
  176. void usage()
  177. {
  178.     cout << "nUsage:n"
  179.             "    DOMPrint [options] <XML file>nn"
  180.             "This program invokes the DOM parser, and builds the DOM tree.n"
  181.             "It then asks the DOMWriter to serialize the DOM tree.n"
  182.             "Options:n"
  183.             "    -e          create entity reference nodes. Default is no expansion.n"
  184.             "    -v=xxx      Validation scheme [always | never | auto*].n"
  185.             "    -n          Enable namespace processing. Default is off.n"
  186.             "    -s          Enable schema processing. Default is off.n"
  187.             "    -f          Enable full schema constraint checking. Defaults is off.n"
  188.             "    -wenc=XXX   Use a particular encoding for output. Default isn"
  189.             "                the same encoding as the input XML file. UTF-8 ifn"
  190.             "                input XML file has not XML declaration.n"
  191.             "    -wfile=xxx  Write to a file instead of stdout.n"
  192.             "    -wscs=xxx   Enable/Disable split-cdata-sections.      Default onn"
  193.             "    -wddc=xxx   Enable/Disable discard-default-content.   Default onn"
  194.             "    -wflt=xxx   Enable/Disable filtering.                 Default offn"
  195.             "    -wfpp=xxx   Enable/Disable format-pretty-print.       Default offn"
  196.             "    -wbom=xxx   Enable/Disable write Byte-Order-Mark      Default offn"
  197.             "    -?          Show this help.nn"
  198.             "  * = Default if not provided explicitly.nn"
  199.             "The parser has intrinsic support for the following encodings:n"
  200.             "    UTF-8, USASCII, ISO8859-1, UTF-16[BL]E, UCS-4[BL]E,n"
  201.             "    WINDOWS-1252, IBM1140, IBM037.n"
  202.           <<  endl;
  203. }
  204. // ---------------------------------------------------------------------------
  205. //
  206. //  main
  207. //
  208. // ---------------------------------------------------------------------------
  209. int main(int argC, char* argV[])
  210. {
  211.     int retval = 0;
  212.     // Initialize the XML4C2 system
  213.     try
  214.     {
  215.         XMLPlatformUtils::Initialize();
  216.     }
  217.     catch(const XMLException &toCatch)
  218.     {
  219.         cerr << "Error during Xerces-c Initialization.n"
  220.              << "  Exception message:"
  221.              << StrX(toCatch.getMessage()) << endl;
  222.         return 1;
  223.     }
  224.     // Check command line and extract arguments.
  225.     if (argC < 2)
  226.     {
  227.         usage();
  228.         XMLPlatformUtils::Terminate();
  229.         return 1;
  230.     }
  231.     // See if non validating dom parser configuration is requested.
  232.     int parmInd;
  233.     for (parmInd = 1; parmInd < argC; parmInd++)
  234.     {
  235.         // Break out on first parm not starting with a dash
  236.         if (argV[parmInd][0] != '-')
  237.             break;
  238.         // Watch for special case help request
  239.         if (!strcmp(argV[parmInd], "-?"))
  240.         {
  241.             usage();
  242.             XMLPlatformUtils::Terminate();
  243.             return 2;
  244.         }
  245.          else if (!strncmp(argV[parmInd], "-v=", 3)
  246.               ||  !strncmp(argV[parmInd], "-V=", 3))
  247.         {
  248.             const char* const parm = &argV[parmInd][3];
  249.             if (!strcmp(parm, "never"))
  250.                 gValScheme = XercesDOMParser::Val_Never;
  251.             else if (!strcmp(parm, "auto"))
  252.                 gValScheme = XercesDOMParser::Val_Auto;
  253.             else if (!strcmp(parm, "always"))
  254.                 gValScheme = XercesDOMParser::Val_Always;
  255.             else
  256.             {
  257.                 cerr << "Unknown -v= value: " << parm << endl;
  258.                 XMLPlatformUtils::Terminate();
  259.                 return 2;
  260.             }
  261.         }
  262.          else if (!strcmp(argV[parmInd], "-n")
  263.               ||  !strcmp(argV[parmInd], "-N"))
  264.         {
  265.             gDoNamespaces = true;
  266.         }
  267.          else if (!strcmp(argV[parmInd], "-s")
  268.               ||  !strcmp(argV[parmInd], "-S"))
  269.         {
  270.             gDoSchema = true;
  271.         }
  272.          else if (!strcmp(argV[parmInd], "-f")
  273.               ||  !strcmp(argV[parmInd], "-F"))
  274.         {
  275.             gSchemaFullChecking = true;
  276.         }
  277.          else if (!strcmp(argV[parmInd], "-e")
  278.               ||  !strcmp(argV[parmInd], "-E"))
  279.         {
  280.             gDoCreate = true;
  281.         }
  282.          else if (!strncmp(argV[parmInd], "-wenc=", 6))
  283.         {
  284.              // Get out the encoding name
  285.              gOutputEncoding = XMLString::transcode( &(argV[parmInd][6]) );
  286.         }
  287.          else if (!strncmp(argV[parmInd], "-wfile=", 7))
  288.         {
  289.              goutputfile =  &(argV[parmInd][7]);
  290.         }
  291.          else if (!strncmp(argV[parmInd], "-wddc=", 6))
  292.         {
  293.             const char* const parm = &argV[parmInd][6];
  294.             if (!strcmp(parm, "on"))
  295. gDiscardDefaultContent = true;
  296.             else if (!strcmp(parm, "off"))
  297. gDiscardDefaultContent = false;
  298.             else
  299.             {
  300.                 cerr << "Unknown -wddc= value: " << parm << endl;
  301.                 XMLPlatformUtils::Terminate();
  302.                 return 2;
  303.             }
  304.         }
  305.          else if (!strncmp(argV[parmInd], "-wscs=", 6))
  306.         {
  307.             const char* const parm = &argV[parmInd][6];
  308.             if (!strcmp(parm, "on"))
  309. gSplitCdataSections = true;
  310. else if (!strcmp(parm, "off"))
  311. gSplitCdataSections = false;
  312.             else
  313.             {
  314.                 cerr << "Unknown -wscs= value: " << parm << endl;
  315.                 XMLPlatformUtils::Terminate();
  316.                 return 2;
  317.             }
  318.         }
  319.          else if (!strncmp(argV[parmInd], "-wflt=", 6))
  320.         {
  321.             const char* const parm = &argV[parmInd][6];
  322.             if (!strcmp(parm, "on"))
  323. gUseFilter = true;
  324. else if (!strcmp(parm, "off"))
  325. gUseFilter = false;
  326.             else
  327.             {
  328.                 cerr << "Unknown -wflt= value: " << parm << endl;
  329.                 XMLPlatformUtils::Terminate();
  330.                 return 2;
  331.             }
  332.         }
  333.          else if (!strncmp(argV[parmInd], "-wfpp=", 6))
  334.         {
  335.             const char* const parm = &argV[parmInd][6];
  336.             if (!strcmp(parm, "on"))
  337. gFormatPrettyPrint = true;
  338. else if (!strcmp(parm, "off"))
  339. gFormatPrettyPrint = false;
  340.             else
  341.             {
  342.                 cerr << "Unknown -wfpp= value: " << parm << endl;
  343.                 XMLPlatformUtils::Terminate();
  344.                 return 2;
  345.             }
  346.         }
  347.          else if (!strncmp(argV[parmInd], "-wbom=", 6))
  348.         {
  349.             const char* const parm = &argV[parmInd][6];
  350.             if (!strcmp(parm, "on"))
  351.                 gWriteBOM = true;
  352.             else if (!strcmp(parm, "off"))
  353.                 gWriteBOM = false;
  354.             else
  355.             {
  356.                 cerr << "Unknown -wbom= value: " << parm << endl;
  357.                 XMLPlatformUtils::Terminate();
  358.                 return 2;
  359.             }
  360.         }
  361.          else
  362.         {
  363.             cerr << "Unknown option '" << argV[parmInd]
  364.                  << "', ignoring it.n" << endl;
  365.         }
  366.     }
  367.     //
  368.     //  And now we have to have only one parameter left and it must be
  369.     //  the file name.
  370.     //
  371.     if (parmInd + 1 != argC)
  372.     {
  373.         usage();
  374.         XMLPlatformUtils::Terminate();
  375.         return 1;
  376.     }
  377.     gXmlFile = argV[parmInd];
  378.     //
  379.     //  Create our parser, then attach an error handler to the parser.
  380.     //  The parser will call back to methods of the ErrorHandler if it
  381.     //  discovers errors during the course of parsing the XML document.
  382.     //
  383.     XercesDOMParser *parser = new XercesDOMParser;
  384.     parser->setValidationScheme(gValScheme);
  385.     parser->setDoNamespaces(gDoNamespaces);
  386.     parser->setDoSchema(gDoSchema);
  387.     parser->setValidationSchemaFullChecking(gSchemaFullChecking);
  388.     parser->setCreateEntityReferenceNodes(gDoCreate);
  389.     DOMTreeErrorReporter *errReporter = new DOMTreeErrorReporter();
  390.     parser->setErrorHandler(errReporter);
  391.     //
  392.     //  Parse the XML file, catching any XML exceptions that might propogate
  393.     //  out of it.
  394.     //
  395.     bool errorsOccured = false;
  396.     try
  397.     {
  398.         parser->parse(gXmlFile);
  399.     }
  400.     catch (const XMLException& e)
  401.     {
  402.         cerr << "An error occurred during parsingn   Message: "
  403.              << StrX(e.getMessage()) << endl;
  404.         errorsOccured = true;
  405.     }
  406.     catch (const DOMException& e)
  407.     {
  408.         const unsigned int maxChars = 2047;
  409.         XMLCh errText[maxChars + 1];
  410.         cerr << "nDOM Error during parsing: '" << gXmlFile << "'n"
  411.              << "DOMException code is:  " << e.code << endl;
  412.         if (DOMImplementation::loadDOMExceptionMsg(e.code, errText, maxChars))
  413.              cerr << "Message is: " << StrX(errText) << endl;
  414.         errorsOccured = true;
  415.     }
  416.     catch (...)
  417.     {
  418.         cerr << "An error occurred during parsingn " << endl;
  419.         errorsOccured = true;
  420.     }
  421.     // If the parse was successful, output the document data from the DOM tree
  422.     if (!errorsOccured && !errReporter->getSawErrors())
  423.     {
  424.         DOMPrintFilter   *myFilter = 0;
  425.         try
  426.         {
  427.             // get a serializer, an instance of DOMWriter
  428.             XMLCh tempStr[100];
  429.             XMLString::transcode("LS", tempStr, 99);
  430.             DOMImplementation *impl          = DOMImplementationRegistry::getDOMImplementation(tempStr);
  431.             DOMWriter         *theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();
  432.             // set user specified output encoding
  433.             theSerializer->setEncoding(gOutputEncoding);
  434.             // plug in user's own filter
  435.             if (gUseFilter)
  436.             {
  437.                 // even we say to show attribute, but the DOMWriter
  438.                 // will not show attribute nodes to the filter as
  439.                 // the specs explicitly says that DOMWriter shall
  440.                 // NOT show attributes to DOMWriterFilter.
  441.                 //
  442.                 // so DOMNodeFilter::SHOW_ATTRIBUTE has no effect.
  443.                 // same DOMNodeFilter::SHOW_DOCUMENT_TYPE, no effect.
  444.                 //
  445.                 myFilter = new DOMPrintFilter(DOMNodeFilter::SHOW_ELEMENT   |
  446.                                               DOMNodeFilter::SHOW_ATTRIBUTE |
  447.                                               DOMNodeFilter::SHOW_DOCUMENT_TYPE);
  448.                 theSerializer->setFilter(myFilter);
  449.             }
  450.             // plug in user's own error handler
  451.             DOMErrorHandler *myErrorHandler = new DOMPrintErrorHandler();
  452.             theSerializer->setErrorHandler(myErrorHandler);
  453.             // set feature if the serializer supports the feature/mode
  454.             if (theSerializer->canSetFeature(XMLUni::fgDOMWRTSplitCdataSections, gSplitCdataSections))
  455.                 theSerializer->setFeature(XMLUni::fgDOMWRTSplitCdataSections, gSplitCdataSections);
  456.             if (theSerializer->canSetFeature(XMLUni::fgDOMWRTDiscardDefaultContent, gDiscardDefaultContent))
  457.                 theSerializer->setFeature(XMLUni::fgDOMWRTDiscardDefaultContent, gDiscardDefaultContent);
  458.             if (theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, gFormatPrettyPrint))
  459.                 theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, gFormatPrettyPrint);
  460.             if (theSerializer->canSetFeature(XMLUni::fgDOMWRTBOM, gWriteBOM))
  461.                 theSerializer->setFeature(XMLUni::fgDOMWRTBOM, gWriteBOM);
  462.             //
  463.             // Plug in a format target to receive the resultant
  464.             // XML stream from the serializer.
  465.             //
  466.             // StdOutFormatTarget prints the resultant XML stream
  467.             // to stdout once it receives any thing from the serializer.
  468.             //
  469.             XMLFormatTarget *myFormTarget;
  470.             if (goutputfile)
  471.                 myFormTarget = new LocalFileFormatTarget(goutputfile);
  472.             else
  473.                 myFormTarget = new StdOutFormatTarget();
  474.             // get the DOM representation
  475.             DOMNode                     *doc = parser->getDocument();
  476.             //
  477.             // do the serialization through DOMWriter::writeNode();
  478.             //
  479.             theSerializer->writeNode(myFormTarget, *doc);
  480.             delete theSerializer;
  481.             //
  482.             // Filter, formatTarget and error handler
  483.             // are NOT owned by the serializer.
  484.             //
  485.             delete myFormTarget;
  486.             delete myErrorHandler;
  487.             if (gUseFilter)
  488.                 delete myFilter;
  489.         }
  490.         catch (XMLException& e)
  491.         {
  492.             cerr << "An error occurred during creation of output transcoder. Msg is:"
  493.                 << endl
  494.                 << StrX(e.getMessage()) << endl;
  495.             retval = 4;
  496.         }
  497.     }
  498.     else
  499.         retval = 4;
  500.     //
  501.     //  Clean up the error handler. The parser does not adopt handlers
  502.     //  since they could be many objects or one object installed for multiple
  503.     //  handlers.
  504.     //
  505.     delete errReporter;
  506.     //
  507.     //  Delete the parser itself.  Must be done prior to calling Terminate, below.
  508.     //
  509.     delete parser;
  510.     // And call the termination method
  511.     XMLPlatformUtils::Terminate();
  512.     XMLString::release(&gOutputEncoding);
  513.     return retval;
  514. }