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

词法分析

开发平台:

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: DOMWriterImpl.hpp,v 1.16 2003/05/22 02:10:51 knoaman Exp $
  58.  * $Log: DOMWriterImpl.hpp,v $
  59.  * Revision 1.16  2003/05/22 02:10:51  knoaman
  60.  * Default the memory manager.
  61.  *
  62.  * Revision 1.15  2003/05/15 18:25:54  knoaman
  63.  * Partial implementation of the configurable memory manager.
  64.  *
  65.  * Revision 1.14  2003/05/12 16:08:11  gareth
  66.  * fix to #18832. Corrected serilization with regards to namespace nodes. Patch by Alby Massari.
  67.  *
  68.  * Revision 1.13  2003/03/16 05:42:04  peiyongz
  69.  * Bug#17983 Formatter does not escape control characters
  70.  *
  71.  * Revision 1.12  2003/01/28 18:31:47  peiyongz
  72.  * Bug#13694: Allow Xerces to write the BOM to XML files
  73.  *
  74.  * Revision 1.11  2003/01/20 16:50:13  tng
  75.  * DOMWriter fix:
  76.  * 1. wrong wrong nested cdata message
  77.  * 2. pretty format the cdata section
  78.  * 3. do not increment error count if warning was issued
  79.  *
  80.  * Revision 1.10  2002/12/10 21:01:32  tng
  81.  * NLS: DOMWriter should use message loader to load message instead of using hardcoded static stirng
  82.  *
  83.  * Revision 1.9  2002/12/09 11:46:08  gareth
  84.  * More pretty pretty print feature. Patch by Kevin King. Closes bug #13840.
  85.  *
  86.  * Revision 1.8  2002/11/04 15:07:35  tng
  87.  * C++ Namespace Support.
  88.  *
  89.  * Revision 1.7  2002/06/25 16:17:16  tng
  90.  * DOM L3: add release()
  91.  *
  92.  * Revision 1.6  2002/06/21 19:33:12  peiyongz
  93.  * support for feature split_cdata_section and entities revised.
  94.  *
  95.  * Revision 1.5  2002/06/17 19:45:58  peiyongz
  96.  * optimization on fFeatures and featureId introduced
  97.  *
  98.  * Revision 1.4  2002/06/14 15:39:02  peiyongz
  99.  * Fix: Compilation error from ForteC on Solaris2.6
  100.  *
  101.  * Revision 1.3  2002/06/10 16:02:21  peiyongz
  102.  * format-pretty-print partially supported
  103.  * resolve encoding from DOMDocument Interface
  104.  *
  105.  * Revision 1.2  2002/06/05 16:03:03  peiyongz
  106.  * delete[] used.
  107.  *
  108.  * Revision 1.1  2002/05/28 22:39:39  peiyongz
  109.  * DOM3 Save Interface: DOMWriter/DOMWriterFilter
  110.  *
  111.  */
  112. /**
  113.  *  DOMWriterImpl provides an API for serializing (writing) a DOM document out in
  114.  * an XML document. The XML data is written to an output stream, the type of
  115.  * which depends on the specific language bindings in use. During
  116.  * serialization of XML data, namespace fixup is done when possible.
  117.  * <p> <code>DOMWriterImpl</code> accepts any node type for serialization. For
  118.  * nodes of type <code>Document</code> or <code>Entity</code>, well formed
  119.  * XML will be created if possible. The serialized output for these node
  120.  * types is either as a Document or an External Entity, respectively, and is
  121.  * acceptable input for an XML parser. For all other types of nodes the
  122.  * serialized form is not specified, but should be something useful to a
  123.  * human for debugging or diagnostic purposes. Note: rigorously designing an
  124.  * external (source) form for stand-alone node types that don't already have
  125.  * one defined in  seems a bit much to take on here.
  126.  * <p>Within a Document or Entity being serialized, Nodes are processed as
  127.  * follows Documents are written including an XML declaration and a DTD
  128.  * subset, if one exists in the DOM. Writing a document node serializes the
  129.  * entire document.  Entity nodes, when written directly by
  130.  * <code>writeNode</code> defined in the <code>DOMWriterImpl</code> interface,
  131.  * output the entity expansion but no namespace fixup is done. The resulting
  132.  * output will be valid as an external entity.  Entity References nodes are
  133.  * serializes as an entity reference of the form
  134.  * <code>"&amp;entityName;"</code>) in the output. Child nodes (the
  135.  * expansion) of the entity reference are ignored.  CDATA sections
  136.  * containing content characters that can not be represented in the
  137.  * specified output encoding are handled according to the
  138.  * "split-cdata-sections" feature.If the feature is <code>true</code>, CDATA
  139.  * sections are split, and the unrepresentable characters are serialized as
  140.  * numeric character references in ordinary content. The exact position and
  141.  * number of splits is not specified. If the feature is <code>false</code>,
  142.  * unrepresentable characters in a CDATA section are reported as errors. The
  143.  * error is not recoverable - there is no mechanism for supplying
  144.  * alternative characters and continuing with the serialization. All other
  145.  * node types (Element, Text, etc.) are serialized to their corresponding
  146.  * XML source form.
  147.  * <p> Within the character data of a document (outside of markup), any
  148.  * characters that cannot be represented directly are replaced with
  149.  * character references. Occurrences of '&lt;' and '&amp;' are replaced by
  150.  * the predefined entities &amp;lt; and &amp;amp. The other predefined
  151.  * entities (&amp;gt, &amp;apos, etc.) are not used; these characters can be
  152.  * included directly. Any character that can not be represented directly in
  153.  * the output character encoding is serialized as a numeric character
  154.  * reference.
  155.  * <p> Attributes not containing quotes are serialized in quotes. Attributes
  156.  * containing quotes but no apostrophes are serialized in apostrophes
  157.  * (single quotes). Attributes containing both forms of quotes are
  158.  * serialized in quotes, with quotes within the value represented by the
  159.  * predefined entity &amp;quot;. Any character that can not be represented
  160.  * directly in the output character encoding is serialized as a numeric
  161.  * character reference.
  162.  * <p> Within markup, but outside of attributes, any occurrence of a character
  163.  * that cannot be represented in the output character encoding is reported
  164.  * as an error. An example would be serializing the element
  165.  * &lt;LaCa馻da/&gt; with the encoding="us-ascii".
  166.  * <p> When requested by setting the <code>normalize-characters</code> feature
  167.  * on <code>DOMWriterImpl</code>, all data to be serialized, both markup and
  168.  * character data, is W3C Text normalized according to the rules defined in
  169.  * . The W3C Text normalization process affects only the data as it is being
  170.  * written; it does not alter the DOM's view of the document after
  171.  * serialization has completed.
  172.  * <p>Namespaces are fixed up during serialization, the serialization process
  173.  * will verify that namespace declarations, namespace prefixes and the
  174.  * namespace URIs associated with Elements and Attributes are consistent. If
  175.  * inconsistencies are found, the serialized form of the document will be
  176.  * altered to remove them. The algorithm used for doing the namespace fixup
  177.  * while seralizing a document is a combination of the algorithms used for
  178.  * lookupNamespaceURI and lookupNamespacePrefix . previous paragraph to be
  179.  * defined closer here.
  180.  * <p>Any changes made affect only the namespace prefixes and declarations
  181.  * appearing in the serialized data. The DOM's view of the document is not
  182.  * altered by the serialization operation, and does not reflect any changes
  183.  * made to namespace declarations or prefixes in the serialized output.
  184.  * <p> While serializing a document the serializer will write out
  185.  * non-specified values (such as attributes whose <code>specified</code> is
  186.  * <code>false</code>) if the <code>output-default-values</code> feature is
  187.  * set to <code>true</code>. If the <code>output-default-values</code> flag
  188.  * is set to <code>false</code> and the <code>use-abstract-schema</code>
  189.  * feature is set to <code>true</code> the abstract schema will be used to
  190.  * determine if a value is specified or not, if
  191.  * <code>use-abstract-schema</code> is not set the <code>specified</code>
  192.  * flag on attribute nodes is used to determine if attribute values should
  193.  * be written out.
  194.  * <p> Ref to Core spec (1.1.9, XML namespaces, 5th paragraph) entity ref
  195.  * description about warning about unbound entity refs. Entity refs are
  196.  * always serialized as &amp;foo;, also mention this in the load part of
  197.  * this spec.
  198.  * <p> When serializing a document the DOMWriterImpl checks to see if the document
  199.  * element in the document is a DOM Level 1 element or a DOM Level 2 (or
  200.  * higher) element (this check is done by looking at the localName of the
  201.  * root element). If the root element is a DOM Level 1 element then the
  202.  * DOMWriterImpl will issue an error if a DOM Level 2 (or higher) element is
  203.  * found while serializing. Likewise if the document element is a DOM Level
  204.  * 2 (or higher) element and the DOMWriterImpl sees a DOM Level 1 element an
  205.  * error is issued. Mixing DOM Level 1 elements with DOM Level 2 (or higher)
  206.  * is not supported.
  207.  * <p> <code>DOMWriterImpl</code>s have a number of named features that can be
  208.  * queried or set. The name of <code>DOMWriterImpl</code> features must be valid
  209.  * XML names. Implementation specific features (extensions) should choose an
  210.  * implementation dependent prefix to avoid name collisions.
  211.  * <p>Here is a list of properties that must be recognized by all
  212.  * implementations.
  213.  * <dl>
  214.  * <dt><code>"normalize-characters"</code></dt>
  215.  * <dd>
  216.  * <dl>
  217.  * <dt><code>true</code></dt>
  218.  * <dd>[
  219.  * optional] (default) Perform the W3C Text Normalization of the characters
  220.  * in document as they are written out. Only the characters being written
  221.  * are (potentially) altered. The DOM document itself is unchanged. </dd>
  222.  * <dt>
  223.  * <code>false</code></dt>
  224.  * <dd>[required] do not perform character normalization. </dd>
  225.  * </dl></dd>
  226.  * <dt>
  227.  * <code>"split-cdata-sections"</code></dt>
  228.  * <dd>
  229.  * <dl>
  230.  * <dt><code>true</code></dt>
  231.  * <dd>[required] (default)
  232.  * Split CDATA sections containing the CDATA section termination marker
  233.  * ']]&gt;' or characters that can not be represented in the output
  234.  * encoding, and output the characters using numeric character references.
  235.  * If a CDATA section is split a warning is issued. </dd>
  236.  * <dt><code>false</code></dt>
  237.  * <dd>[
  238.  * required] Signal an error if a <code>CDATASection</code> contains an
  239.  * unrepresentable character. </dd>
  240.  * </dl></dd>
  241.  * <dt><code>"validation"</code></dt>
  242.  * <dd>
  243.  * <dl>
  244.  * <dt><code>true</code></dt>
  245.  * <dd>[
  246.  * optional] Use the abstract schema to validate the document as it is being
  247.  * serialized. If validation errors are found the error handler is notified
  248.  * about the error. Setting this state will also set the feature
  249.  * <code>use-abstract-schema</code> to <code>true</code>. </dd>
  250.  * <dt><code>false</code></dt>
  251.  * <dd>[
  252.  * required] (default) Don't validate the document as it is being
  253.  * serialized. </dd>
  254.  * </dl></dd>
  255.  * <dt><code>"expand-entity-references"</code></dt>
  256.  * <dd>
  257.  * <dl>
  258.  * <dt><code>true</code></dt>
  259.  * <dd>[
  260.  * optional] Expand <code>EntityReference</code> nodes when serializing. </dd>
  261.  * <dt>
  262.  * <code>false</code></dt>
  263.  * <dd>[required] (default) Serialize all
  264.  * <code>EntityReference</code> nodes as XML entity references. </dd>
  265.  * </dl></dd>
  266.  * <dt>
  267.  * <code>"whitespace-in-element-content"</code></dt>
  268.  * <dd>
  269.  * <dl>
  270.  * <dt><code>true</code></dt>
  271.  * <dd>[required] (
  272.  * default) Output all white spaces in the document. </dd>
  273.  * <dt><code>false</code></dt>
  274.  * <dd>[
  275.  * optional] Only output white space that is not within element content. The
  276.  * implementation is expected to use the
  277.  * <code>isWhitespaceInElementContent</code> flag on <code>Text</code> nodes
  278.  * to determine if a text node should be written out or not. </dd>
  279.  * </dl></dd>
  280.  * <dt>
  281.  * <code>"discard-default-content"</code></dt>
  282.  * <dd>
  283.  * <dl>
  284.  * <dt><code>true</code></dt>
  285.  * <dd>[required] (default
  286.  * ) Use whatever information available to the implementation (i.e. XML
  287.  * schema, DTD, the <code>specified</code> flag on <code>Attr</code> nodes,
  288.  * and so on) to decide what attributes and content should be serialized or
  289.  * not. Note that the <code>specified</code> flag on <code>Attr</code> nodes
  290.  * in itself is not always reliable, it is only reliable when it is set to
  291.  * <code>false</code> since the only case where it can be set to
  292.  * <code>false</code> is if the attribute was created by a Level 1
  293.  * implementation. </dd>
  294.  * <dt><code>false</code></dt>
  295.  * <dd>[required] Output all attributes and
  296.  * all content. </dd>
  297.  * </dl></dd>
  298.  * <dt><code>"format-canonical"</code></dt>
  299.  * <dd>
  300.  * <dl>
  301.  * <dt><code>true</code></dt>
  302.  * <dd>[optional]
  303.  * This formatting writes the document according to the rules specified in .
  304.  * Setting this feature to true will set the feature "format-pretty-print"
  305.  * to false. </dd>
  306.  * <dt><code>false</code></dt>
  307.  * <dd>[required] (default) Don't canonicalize the
  308.  * output. </dd>
  309.  * </dl></dd>
  310.  * <dt><code>"format-pretty-print"</code></dt>
  311.  * <dd>
  312.  * <dl>
  313.  * <dt><code>true</code></dt>
  314.  * <dd>[optional]
  315.  * Formatting the output by adding whitespace to produce a pretty-printed,
  316.  * indented, human-readable form. The exact form of the transformations is
  317.  * not specified by this specification. Setting this feature to true will
  318.  * set the feature "format-canonical" to false. </dd>
  319.  * <dt><code>false</code></dt>
  320.  * <dd>[required]
  321.  * (default) Don't pretty-print the result. </dd>
  322.  * </dl></dd>
  323.  * </dl>
  324.  * <p>See also the <a href='http://www.w3.org/TR/2001/WD-DOM-Level-3-ASLS-20011025'>Document Object Model (DOM) Level 3 Abstract Schemas and Load
  325.  * and Save Specification</a>.
  326.  */
  327. #ifndef DOMWriterImpl_HEADER_GUARD_
  328. #define DOMWriterImpl_HEADER_GUARD_
  329. #include <xercesc/dom/DOM.hpp>
  330. #include <xercesc/dom/DOMWriter.hpp>
  331. #include <xercesc/util/XMLDOMMsg.hpp>
  332. #include <xercesc/util/RefHashTableOf.hpp>
  333. #include <xercesc/util/RefVectorOf.hpp>
  334. XERCES_CPP_NAMESPACE_BEGIN
  335. class CDOM_EXPORT DOMWriterImpl:public DOMWriter {
  336. public:
  337.     /** @name Constructor and Destructor */
  338.     //@{
  339.     /**
  340.      * Constructor.
  341.      */
  342.     DOMWriterImpl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  343.     /**
  344.      * Destructor.
  345.      */
  346.     ~DOMWriterImpl();
  347.     //@}
  348.     /** @name Inplementation of Abstract interface */
  349.     virtual bool               canSetFeature(const XMLCh* const featName
  350.                                            , bool               state) const;
  351.     virtual void               setFeature(const XMLCh* const featName
  352.                                         , bool               state);
  353.     virtual bool               getFeature(const XMLCh* const featName) const;
  354.     virtual void               setEncoding(const XMLCh* const encoding);
  355.     virtual const XMLCh*       getEncoding() const;
  356.     virtual void               setNewLine(const XMLCh* const newLine);
  357.     virtual const XMLCh*       getNewLine() const;
  358.     virtual void               setErrorHandler(DOMErrorHandler *errorHandler);
  359.     virtual DOMErrorHandler*   getErrorHandler() const;
  360.     virtual void               setFilter(DOMWriterFilter *filter);
  361.     virtual DOMWriterFilter*   getFilter() const;
  362.     virtual bool               writeNode(XMLFormatTarget* const destination
  363.                                        , const DOMNode         &nodeToWrite);
  364.     virtual void               release();
  365.     /**
  366.   *  The caller is responsible for the release of the returned string
  367.   */
  368.     virtual XMLCh*             writeToString(const DOMNode &nodeToWrite);
  369.     //@}
  370. private:
  371.     /** unimplemented copy ctor and assignment operator */
  372.     DOMWriterImpl(const DOMWriterImpl&);
  373.     DOMWriterImpl & operator = (const DOMWriterImpl&);
  374.     /** helper **/
  375.     void                          initSession(const DOMNode* const);
  376.     void                          processNode(const DOMNode* const);
  377.     DOMNodeFilter::FilterAction   checkFilter(const DOMNode* const) const;
  378.     bool                          checkFeature(const XMLCh* const featName
  379.                                              , bool               state
  380.                                              , int&               featureId) const;
  381.     bool                          reportError(const DOMNode* const    errorNode
  382.                                             , DOMError::ErrorSeverity errorType
  383.                                             , const XMLCh*   const    errorMsg);
  384.     bool                          reportError(const DOMNode* const    errorNode
  385.                                             , DOMError::ErrorSeverity errorType
  386.                                             , XMLDOMMsg::Codes        toEmit);
  387.     void                          procCdataSection(const XMLCh*   const nodeValue
  388.                                                  , const DOMNode* const nodeToWrite
  389.                                                  , int level);
  390.     void                          procUnrepCharInCdataSection(const XMLCh*   const nodeValue
  391.                                                             , const DOMNode* const nodeToWrite
  392.                                                             , int level);
  393.     bool                          canSetFeature(const int featureId
  394.                                               , bool      val)     const;
  395.     void                          setFeature(const int featureId
  396.                                            , bool      val);
  397.     bool                          getFeature(const int featureId) const;
  398.     void                          printNewLine();
  399.     void                          setURCharRef();
  400.     void printIndent(int level) const;
  401.     //does the actual work for processNode while keeping track of the level
  402.     void processNode(const DOMNode* const nodeToWrite, int level);
  403.     void processBOM();
  404.     // -----------------------------------------------------------------------
  405.     //  Private data members
  406.     //
  407.     //  fFeatures
  408.     //
  409.     //  fEncoding
  410.     //      own it
  411.     //
  412.     //  fNewLine
  413.     //      own it
  414.     //
  415.     //  fErrorHandler
  416.     //      don't own it
  417.     //
  418.     //  fFilter
  419.     //      don't own it
  420.     //
  421.     //  fDocumentVersion
  422.     //      The XML Version of the document to be serialized.
  423.     // 
  424.     //  fEncodingUsed (session var)
  425.     //      the actual encoding used in WriteNode(),
  426.     //      it does not own any data(memory).
  427.     //
  428.     //  fNewLineUsed (session var)
  429.     //      the actual "end of line" sequence used in WriteNode(),
  430.     //      it does not own any data(memory).
  431.     //
  432.     //  fFormatter (session var)
  433.     //      the formatter used in WriteNode()
  434.     //
  435.     //  fErrorCount
  436.     //      the count of error encountered in the serialization,
  437.     //      which neither the error handler, nor the serializer itself,
  438.     //      treat as fatal. And the serializer will return true/false
  439.     //      based on this value.
  440.     //
  441.     //  fCurrentLine
  442.     //      the current line. Used to track the line number the current
  443.     //      node begins on
  444.     //
  445.     // -----------------------------------------------------------------------
  446.     int                           fFeatures;
  447.     XMLCh                        *fEncoding;
  448.     XMLCh                        *fNewLine;
  449.     DOMErrorHandler              *fErrorHandler;
  450.     DOMWriterFilter              *fFilter;
  451.     const XMLCh                  *fDocumentVersion;
  452.     //session vars
  453.     const XMLCh                  *fEncodingUsed;
  454.     const XMLCh                  *fNewLineUsed;
  455.     XMLFormatter                 *fFormatter;
  456.     int                           fErrorCount;
  457.     int                           fCurrentLine;
  458.     RefVectorOf< RefHashTableOf<XMLCh> >* fNamespaceStack;
  459.     MemoryManager*               fMemoryManager;
  460. };
  461. inline void DOMWriterImpl::setFeature(const int featureId
  462.                                     , bool      val)
  463. {
  464.     (val)? fFeatures |= (1<<featureId) : fFeatures &= ~(1<<featureId);
  465. };
  466. inline bool DOMWriterImpl::getFeature(const int featureId) const
  467. {
  468.     return ((fFeatures & ( 1<<featureId )) != 0) ? true : false;
  469. };
  470. inline void DOMWriterImpl::setURCharRef()
  471. {
  472.     fFormatter->setUnRepFlags(XMLFormatter::UnRep_CharRef);
  473. }
  474. XERCES_CPP_NAMESPACE_END
  475. #endif