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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001-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) 2001, 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: XercesDOMParser.hpp,v 1.14 2003/05/15 18:26:50 knoaman Exp $
  58.  *
  59.  */
  60. #if !defined(XercesDOMParser_HPP)
  61. #define XercesDOMParser_HPP
  62. #include <xercesc/parsers/AbstractDOMParser.hpp>
  63. XERCES_CPP_NAMESPACE_BEGIN
  64. class EntityResolver;
  65. class ErrorHandler;
  66. class Grammar;
  67.  /**
  68.   * This class implements the Document Object Model (DOM) interface.
  69.   * It should be used by applications which choose to parse and
  70.   * process the XML document using the DOM api's. This implementation
  71.   * also allows the applications to install an error and an entitty
  72.   * handler (useful extensions to the DOM specification).
  73.   *
  74.   * <p>It can be used to instantiate a validating or non-validating
  75.   * parser, by setting a member flag.</p>
  76.   */
  77. class PARSERS_EXPORT XercesDOMParser : public AbstractDOMParser
  78. {
  79. public :
  80.     // -----------------------------------------------------------------------
  81.     //  Constructors and Detructor
  82.     // -----------------------------------------------------------------------
  83.     /** @name Constructors and Destructor */
  84.     //@{
  85.     /** Construct a XercesDOMParser, with an optional validator
  86.       *
  87.       * Constructor with an instance of validator class to use for
  88.       * validation. If you don't provide a validator, a default one will
  89.       * be created for you in the scanner.
  90.       *
  91.       * @param valToAdopt Pointer to the validator instance to use. The
  92.       *                   parser is responsible for freeing the memory.
  93.       */
  94.     XercesDOMParser
  95.     (
  96.           XMLValidator* const  valToAdopt = 0
  97.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  98.     );
  99.     /**
  100.       * Destructor
  101.       */
  102.     virtual ~XercesDOMParser();
  103.     //@}
  104.     // -----------------------------------------------------------------------
  105.     //  Getter methods
  106.     // -----------------------------------------------------------------------
  107.     /** @name Getter methods */
  108.     //@{
  109.     /** Get a pointer to the error handler
  110.       *
  111.       * This method returns the installed error handler. If no handler
  112.       * has been installed, then it will be a zero pointer.
  113.       *
  114.       * @return The pointer to the installed error handler object.
  115.       */
  116.     ErrorHandler* getErrorHandler();
  117.     /** Get a const pointer to the error handler
  118.       *
  119.       * This method returns the installed error handler.  If no handler
  120.       * has been installed, then it will be a zero pointer.
  121.       *
  122.       * @return A const pointer to the installed error handler object.
  123.       */
  124.     const ErrorHandler* getErrorHandler() const;
  125.     /** Get a pointer to the entity resolver
  126.       *
  127.       * This method returns the installed entity resolver.  If no resolver
  128.       * has been installed, then it will be a zero pointer.
  129.       *
  130.       * @return The pointer to the installed entity resolver object.
  131.       */
  132.     EntityResolver* getEntityResolver();
  133.     /** Get a const pointer to the entity resolver
  134.       *
  135.       * This method returns the installed entity resolver. If no resolver
  136.       * has been installed, then it will be a zero pointer.
  137.       *
  138.       * @return A const pointer to the installed entity resolver object.
  139.       */
  140.     const EntityResolver* getEntityResolver() const;
  141.     /** Get the 'Grammar caching' flag
  142.       *
  143.       * This method returns the state of the parser's grammar caching when
  144.       * parsing an XML document.
  145.       *
  146.       * @return true, if the parser is currently configured to
  147.       *         cache grammars, false otherwise.
  148.       *
  149.       * @see #cacheGrammarFromParse
  150.       */
  151.     bool isCachingGrammarFromParse() const;
  152.     /** Get the 'Use cached grammar' flag
  153.       *
  154.       * This method returns the state of the parser's use of cached grammar
  155.       * when parsing an XML document.
  156.       *
  157.       * @return true, if the parser is currently configured to
  158.       *         use cached grammars, false otherwise.
  159.       *
  160.       * @see #useCachedGrammarInParse
  161.       */
  162.     bool isUsingCachedGrammarInParse() const;
  163.     /**
  164.      * Retrieve the grammar that is associated with the specified namespace key
  165.      *
  166.      * @param  nameSpaceKey Namespace key
  167.      * @return Grammar associated with the Namespace key.
  168.      */
  169.     Grammar* getGrammar(const XMLCh* const nameSpaceKey);
  170.     /**
  171.      * Retrieve the grammar where the root element is declared.
  172.      *
  173.      * @return Grammar where root element declared
  174.      */
  175.     Grammar* getRootGrammar();
  176.     /**
  177.      * Returns the string corresponding to a URI id from the URI string pool.
  178.      *
  179.      * @param uriId id of the string in the URI string pool.
  180.      * @return URI string corresponding to the URI id.
  181.      */
  182.     const XMLCh* getURIText(unsigned int uriId) const;
  183.     /**
  184.      * Returns the current src offset within the input source.
  185.      *
  186.      * @return offset within the input source
  187.      */
  188.     unsigned int getSrcOffset() const;
  189.     //@}
  190.     // -----------------------------------------------------------------------
  191.     //  Setter methods
  192.     // -----------------------------------------------------------------------
  193.     /** @name Setter methods */
  194.     //@{
  195.     /** Set the error handler
  196.       *
  197.       * This method allows applications to install their own error handler
  198.       * to trap error and warning messages.
  199.       *
  200.       * <i>Any previously set handler is merely dropped, since the parser
  201.       * does not own them.</i>
  202.       *
  203.       * @param handler  A const pointer to the user supplied error
  204.       *                 handler.
  205.       *
  206.       * @see #getErrorHandler
  207.       */
  208.     void setErrorHandler(ErrorHandler* const handler);
  209.     /** Set the entity resolver
  210.       *
  211.       * This method allows applications to install their own entity
  212.       * resolver. By installing an entity resolver, the applications
  213.       * can trap and potentially redirect references to external
  214.       * entities.
  215.       *
  216.       * <i>Any previously set resolver is merely dropped, since the parser
  217.       * does not own them.</i>
  218.       *
  219.       * @param handler  A const pointer to the user supplied entity
  220.       *                 resolver.
  221.       *
  222.       * @see #getEntityResolver
  223.       */
  224.     void setEntityResolver(EntityResolver* const handler);
  225.     /** Set the 'Grammar caching' flag
  226.       *
  227.       * This method allows users to enable or disable caching of grammar when
  228.       * parsing XML documents. When set to true, the parser will cache the
  229.       * resulting grammar for use in subsequent parses.
  230.       *
  231.       * If the flag is set to true, the 'Use cached grammar' flag will also be
  232.       * set to true.
  233.       *
  234.       * The parser's default state is: false.
  235.       *
  236.       * @param newState The value specifying whether we should cache grammars
  237.       *                 or not.
  238.       *
  239.       * @see #isCachingGrammarFromParse
  240.       * @see #useCachedGrammarInParse
  241.       */
  242.     void cacheGrammarFromParse(const bool newState);
  243.     /** Set the 'Use cached grammar' flag
  244.       *
  245.       * This method allows users to enable or disable the use of cached
  246.       * grammars.  When set to true, the parser will use the cached grammar,
  247.       * instead of building the grammar from scratch, to validate XML
  248.       * documents.
  249.       *
  250.       * If the 'Grammar caching' flag is set to true, this mehod ignore the
  251.       * value passed in.
  252.       *
  253.       * The parser's default state is: false.
  254.       *
  255.       * @param newState The value specifying whether we should use the cached
  256.       *                 grammar or not.
  257.       *
  258.       * @see #isUsingCachedGrammarInParse
  259.       * @see #cacheGrammarFromParse
  260.       */
  261.     void useCachedGrammarInParse(const bool newState);
  262.     //@}
  263.     // -----------------------------------------------------------------------
  264.     //  Utility methods
  265.     // -----------------------------------------------------------------------
  266.     /** @name Utility methods */
  267.     //@{
  268.     /** Reset the documents vector pool and release all the associated memory
  269.       * back to the system.
  270.       *
  271.       * When parsing a document using a DOM parser, all memory allocated
  272.       * for a DOM tree is associated to the DOM document.
  273.       *
  274.       * If you do multiple parse using the same DOM parser instance, then
  275.       * multiple DOM documents will be generated and saved in a vector pool.
  276.       * All these documents (and thus all the allocated memory)
  277.       * won't be deleted until the parser instance is destroyed.
  278.       *
  279.       * If you don't need these DOM documents anymore and don't want to
  280.       * destroy the DOM parser instance at this moment, then you can call this method
  281.       * to reset the document vector pool and release all the allocated memory
  282.       * back to the system.
  283.       *
  284.       * It is an error to call this method if you are in the middle of a
  285.       * parse (e.g. in the mid of a progressive parse).
  286.       *
  287.       * @exception IOException An exception from the parser if this function
  288.       *            is called when a parse is in progress.
  289.       *
  290.       */
  291.     void resetDocumentPool();
  292.     //@}
  293.     // -----------------------------------------------------------------------
  294.     //  Implementation of the XMLErrorReporter interface.
  295.     // -----------------------------------------------------------------------
  296.     /** @name Implementation of the XMLErrorReporter interface. */
  297.     //@{
  298.     /** Handle errors reported from the parser
  299.       *
  300.       * This method is used to report back errors found while parsing the
  301.       * XML file. This method is also borrowed from the SAX specification.
  302.       * It calls the corresponding user installed Error Handler method:
  303.       * 'fatal', 'error', 'warning' depending on the severity of the error.
  304.       * This classification is defined by the XML specification.
  305.       *
  306.       * @param errCode An integer code for the error.
  307.       * @param msgDomain A const pointer to an Unicode string representing
  308.       *                  the message domain to use.
  309.       * @param errType An enumeration classifying the severity of the error.
  310.       * @param errorText A const pointer to an Unicode string representing
  311.       *                  the text of the error message.
  312.       * @param systemId  A const pointer to an Unicode string representing
  313.       *                  the system id of the XML file where this error
  314.       *                  was discovered.
  315.       * @param publicId  A const pointer to an Unicode string representing
  316.       *                  the public id of the XML file where this error
  317.       *                  was discovered.
  318.       * @param lineNum   The line number where the error occurred.
  319.       * @param colNum    The column number where the error occurred.
  320.       * @see ErrorHandler
  321.       */
  322.     virtual void error
  323.     (
  324.         const   unsigned int                errCode
  325.         , const XMLCh* const                msgDomain
  326.         , const XMLErrorReporter::ErrTypes  errType
  327.         , const XMLCh* const                errorText
  328.         , const XMLCh* const                systemId
  329.         , const XMLCh* const                publicId
  330.         , const XMLSSize_t                  lineNum
  331.         , const XMLSSize_t                  colNum
  332.     );
  333.     /** Reset any error data before a new parse
  334.      *
  335.       * This method allows the user installed Error Handler callback to
  336.       * 'reset' itself.
  337.       *
  338.       * <b><font color="#FF0000">This method is a no-op for this DOM
  339.       * implementation.</font></b>
  340.       */
  341.     virtual void resetErrors();
  342.     //@}
  343.     // -----------------------------------------------------------------------
  344.     //  Implementation of the XMLEntityHandler interface.
  345.     // -----------------------------------------------------------------------
  346.     /** @name Implementation of the XMLEntityHandler interface. */
  347.     //@{
  348.     /** Handle an end of input source event
  349.       *
  350.       * This method is used to indicate the end of parsing of an external
  351.       * entity file.
  352.       *
  353.       * <b><font color="#FF0000">This method is a no-op for this DOM
  354.       * implementation.</font></b>
  355.       *
  356.       * @param inputSource A const reference to the InputSource object
  357.       *                    which points to the XML file being parsed.
  358.       * @see InputSource
  359.       */
  360.     virtual void endInputSource(const InputSource& inputSource);
  361.     /** Expand a system id
  362.       *
  363.       * This method allows an installed XMLEntityHandler to further
  364.       * process any system id's of enternal entities encountered in
  365.       * the XML file being parsed, such as redirection etc.
  366.       *
  367.       * <b><font color="#FF0000">This method always returns 'false'
  368.       * for this DOM implementation.</font></b>
  369.       *
  370.       * @param systemId  A const pointer to an Unicode string representing
  371.       *                  the system id scanned by the parser.
  372.       * @param toFill    A pointer to a buffer in which the application
  373.       *                  processed system id is stored.
  374.       * @return 'true', if any processing is done, 'false' otherwise.
  375.       */
  376.     virtual bool expandSystemId
  377.     (
  378.         const   XMLCh* const    systemId
  379.         ,       XMLBuffer&      toFill
  380.     );
  381.     /** Reset any entity handler information
  382.       *
  383.       * This method allows the installed XMLEntityHandler to reset
  384.       * itself.
  385.       *
  386.       * <b><font color="#FF0000">This method is a no-op for this DOM
  387.       * implementation.</font></b>
  388.       */
  389.     virtual void resetEntities();
  390.     /** Resolve a public/system id
  391.       *
  392.       * This method allows a user installed entity handler to further
  393.       * process any pointers to external entities. The applications can
  394.       * implement 'redirection' via this callback. This method is also
  395.       * borrowed from the SAX specification.
  396.       *
  397.       * @param publicId A const pointer to a Unicode string representing the
  398.       *                 public id of the entity just parsed.
  399.       * @param systemId A const pointer to a Unicode string representing the
  400.       *                 system id of the entity just parsed.
  401.       * @param baseURI  A const pointer to a Unicode string representing the
  402.       *                 base URI of the entity just parsed,
  403.       *                 or <code>null</code> if there is no base URI.
  404.       * @return The value returned by the user installed resolveEntity
  405.       *         method or NULL otherwise to indicate no processing was done.
  406.       *         The returned InputSource is owned by the parser which is
  407.       *         responsible to clean up the memory.
  408.       * @see DOMEntityResolver
  409.       * @see XMLEntityHandler
  410.       */
  411.     virtual InputSource* resolveEntity
  412.     (
  413.         const   XMLCh* const    publicId
  414.         , const XMLCh* const    systemId
  415.         , const XMLCh* const    baseURI = 0
  416.     );
  417.     /** Handle a 'start input source' event
  418.       *
  419.       * This method is used to indicate the start of parsing an external
  420.       * entity file.
  421.       *
  422.       * <b><font color="#FF0000">This method is a no-op for this DOM parse
  423.       * implementation.</font></b>
  424.       *
  425.       * @param inputSource A const reference to the InputSource object
  426.       *                    which points to the external entity
  427.       *                    being parsed.
  428.       */
  429.     virtual void startInputSource(const InputSource& inputSource);
  430.     //@}
  431.     // -----------------------------------------------------------------------
  432.     //  Grammar preparsing interface
  433.     // -----------------------------------------------------------------------
  434.     /** @name Implementation of Grammar preparsing interface's. */
  435.     //@{
  436.     /**
  437.       * Preparse schema grammar (XML Schema, DTD, etc.) via an input source
  438.       * object.
  439.       *
  440.       * This method invokes the preparsing process on a schema grammar XML
  441.       * file specified by the SAX InputSource parameter. If the 'toCache' flag
  442.       * is enabled, the parser will cache the grammars for re-use. If a grammar
  443.       * key is found in the pool, no caching of any grammar will take place.
  444.       *
  445.       * <p><b>"Experimental - subject to change"</b></p>
  446.       *
  447.       * @param source A const reference to the SAX InputSource object which
  448.       *               points to the schema grammar file to be preparsed.
  449.       * @param grammarType The grammar type (Schema or DTD).
  450.       * @param toCache If <code>true</code>, we cache the preparsed grammar,
  451.       *                otherwise, no chaching. Default is <code>false</code>.
  452.       * @return The preparsed schema grammar object (SchemaGrammar or
  453.       *         DTDGrammar). That grammar object is owned by the parser.
  454.       *
  455.       * @exception SAXException Any SAX exception, possibly
  456.       *            wrapping another exception.
  457.       * @exception XMLException An exception from the parser or client
  458.       *            handler code.
  459.       * @exception DOMException A DOM exception as per DOM spec.
  460.       *
  461.       * @see InputSource#InputSource
  462.       */
  463.     Grammar* loadGrammar(const InputSource& source,
  464.                          const short grammarType,
  465.                          const bool toCache = false);
  466.     /**
  467.       * Preparse schema grammar (XML Schema, DTD, etc.) via a file path or URL
  468.       *
  469.       * This method invokes the preparsing process on a schema grammar XML
  470.       * file specified by the file path parameter. If the 'toCache' flag
  471.       * is enabled, the parser will cache the grammars for re-use. If a grammar
  472.       * key is found in the pool, no caching of any grammar will take place.
  473.       *
  474.       * <p><b>"Experimental - subject to change"</b></p>
  475.       *
  476.       * @param systemId A const XMLCh pointer to the Unicode string which
  477.       *                 contains the path to the XML grammar file to be
  478.       *                 preparsed.
  479.       * @param grammarType The grammar type (Schema or DTD).
  480.       * @param toCache If <code>true</code>, we cache the preparsed grammar,
  481.       *                otherwise, no chaching. Default is <code>false</code>.
  482.       * @return The preparsed schema grammar object (SchemaGrammar or
  483.       *         DTDGrammar). That grammar object is owned by the parser.
  484.       *
  485.       * @exception SAXException Any SAX exception, possibly
  486.       *            wrapping another exception.
  487.       * @exception XMLException An exception from the parser or client
  488.       *            handler code.
  489.       * @exception DOMException A DOM exception as per DOM spec.
  490.       */
  491.     Grammar* loadGrammar(const XMLCh* const systemId,
  492.                          const short grammarType,
  493.                          const bool toCache = false);
  494.     /**
  495.       * Preparse schema grammar (XML Schema, DTD, etc.) via a file path or URL
  496.       *
  497.       * This method invokes the preparsing process on a schema grammar XML
  498.       * file specified by the file path parameter. If the 'toCache' flag
  499.       * is enabled, the parser will cache the grammars for re-use. If a grammar
  500.       * key is found in the pool, no caching of any grammar will take place.
  501.       *
  502.       * <p><b>"Experimental - subject to change"</b></p>
  503.       *
  504.       * @param systemId A const char pointer to a native string which contains
  505.       *                 the path to the XML grammar file to be preparsed.
  506.       * @param grammarType The grammar type (Schema or DTD).
  507.       * @param toCache If <code>true</code>, we cache the preparsed grammar,
  508.       *                otherwise, no chaching. Default is <code>false</code>.
  509.       * @return The preparsed schema grammar object (SchemaGrammar or
  510.       *         DTDGrammar). That grammar object is owned by the parser.
  511.       *
  512.       * @exception SAXException Any SAX exception, possibly
  513.       *            wrapping another exception.
  514.       * @exception XMLException An exception from the parser or client
  515.       *            handler code.
  516.       * @exception DOMException A DOM exception as per DOM spec.
  517.       */
  518.     Grammar* loadGrammar(const char* const systemId,
  519.                          const short grammarType,
  520.                          const bool toCache = false);
  521.     /**
  522.       * This method allows the user to reset the pool of cached grammars.
  523.       */
  524.     void resetCachedGrammarPool();
  525.     //@}
  526. private :
  527.     // -----------------------------------------------------------------------
  528.     //  Private data members
  529.     //
  530.     //  fEntityResolver
  531.     //      The installed SAX entity resolver, if any. Null if none.
  532.     //
  533.     //  fErrorHandler
  534.     //      The installed SAX error handler, if any. Null if none.
  535.     //-----------------------------------------------------------------------
  536.     EntityResolver*          fEntityResolver;
  537.     ErrorHandler*            fErrorHandler;
  538. };
  539. // ---------------------------------------------------------------------------
  540. //  XercesDOMParser: Handlers for the XMLEntityHandler interface
  541. // ---------------------------------------------------------------------------
  542. inline void XercesDOMParser::endInputSource(const InputSource&)
  543. {
  544.     // The DOM entity resolver doesn't handle this
  545. }
  546. inline bool XercesDOMParser::expandSystemId(const XMLCh* const, XMLBuffer&)
  547. {
  548.     // The DOM entity resolver doesn't handle this
  549.     return false;
  550. }
  551. inline void XercesDOMParser::resetEntities()
  552. {
  553.     // Nothing to do on this one
  554. }
  555. inline void XercesDOMParser::startInputSource(const InputSource&)
  556. {
  557.     // The DOM entity resolver doesn't handle this
  558. }
  559. // ---------------------------------------------------------------------------
  560. //  XercesDOMParser: Getter methods
  561. // ---------------------------------------------------------------------------
  562. inline ErrorHandler* XercesDOMParser::getErrorHandler()
  563. {
  564.     return fErrorHandler;
  565. }
  566. inline const ErrorHandler* XercesDOMParser::getErrorHandler() const
  567. {
  568.     return fErrorHandler;
  569. }
  570. inline EntityResolver* XercesDOMParser::getEntityResolver()
  571. {
  572.     return fEntityResolver;
  573. }
  574. inline const EntityResolver* XercesDOMParser::getEntityResolver() const
  575. {
  576.     return fEntityResolver;
  577. }
  578. XERCES_CPP_NAMESPACE_END
  579. #endif