domwriterimpl.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 1,852 行 · 第 1/5 页

CPP
1,852
字号
/* * Copyright 2002-2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: DOMWriterImpl.cpp,v 1.55 2004/09/08 13:55:52 peiyongz Exp $ * $Log: DOMWriterImpl.cpp,v $ * Revision 1.55  2004/09/08 13:55:52  peiyongz * Apache License Version 2.0 * * Revision 1.54  2004/07/06 15:16:57  amassari * Fix for jira#1238: DOMWriter was creating an XMLFormatter without propagating the memory manager * * Revision 1.53  2004/05/10 08:03:25  amassari * Performance: push a new map on the namespace stack only when an element has a xmlns attribute * * Revision 1.52  2004/04/01 22:05:32  peiyongz * invoke DOMException with Memory Manager * * Revision 1.51  2004/01/29 11:44:27  cargilld * Code cleanup changes to get rid of various compiler diagnostic messages. * * Revision 1.50  2004/01/20 23:23:57  peiyongz * patch to Bug#25751 * * Revision 1.49  2004/01/13 20:47:42  knoaman * Remove unnecessary local static data * * Revision 1.48  2004/01/13 16:34:20  cargilld * Misc memory management changes. * * Revision 1.47  2003/12/17 00:18:33  cargilld * Update to memory management so that the static memory manager (one used to call Initialize) is only for static data. * * Revision 1.46  2003/11/24 19:52:22  neilg * fix a typo * * Revision 1.45  2003/11/24 12:27:57  gareth * added in support for xml-declaration feature. * * Revision 1.44  2003/11/24 11:10:58  gareth * Fix for bug 22917. Patch by Adam Heinz . * * Revision 1.43  2003/11/10 17:52:58  amassari * Fixed memory leak * * Revision 1.42  2003/10/01 16:32:37  neilg * improve handling of out of memory conditions, bug #23415.  Thanks to David Cargill. * * Revision 1.41  2003/08/14 16:31:13  gareth * Method added to allow serilization of custom nodes from derived classes. * * Revision 1.40  2003/08/12 12:46:57  gareth * Added serialization for attribute nodes. Patch by Caroline Rioux. * * Revision 1.39  2003/05/18 14:02:03  knoaman * Memory manager implementation: pass per instance manager. * * Revision 1.38  2003/05/16 21:36:55  knoaman * Memory manager implementation: Modify constructors to pass in the memory manager. * * Revision 1.37  2003/05/15 18:25:54  knoaman * Partial implementation of the configurable memory manager. * * Revision 1.36  2003/05/14 16:20:13  gareth * Fix to problem with multiple default namespace attributes being serialized. Patch by Alberto Massari. * * Revision 1.35  2003/05/12 16:08:11  gareth * fix to #18832. Corrected serilization with regards to namespace nodes. Patch by Alby Massari. * * Revision 1.34  2003/05/06 13:48:35  neilg * fix GCC compilation problem and incorrect #include * * Revision 1.33  2003/05/05 21:23:21  neilg * use of the new DOMNodeSPtr typedef and its friends to enable reference counting in * the DOMWriter implementation for applications that require it. * * Revision 1.32  2003/04/02 03:14:42  peiyongz * Bug#18594: DOMWriter does not recognize Document Fragment * * Revision 1.31  2003/03/16 05:42:04  peiyongz * Bug#17983 Formatter does not escape control characters * * Revision 1.30  2003/02/25 16:07:37  tng * [Bug 13493] Use const on static data in DOMWriterImpl.cpp. * * Revision 1.29  2003/01/28 18:31:47  peiyongz * Bug#13694: Allow Xerces to write the BOM to XML files * * Revision 1.28  2003/01/24 20:21:46  tng * DOMWriter: Call XMLFormatTarget::flush when done. * * Revision 1.27  2003/01/20 16:50:13  tng * DOMWriter fix: * 1. wrong wrong nested cdata message * 2. pretty format the cdata section * 3. do not increment error count if warning was issued * * Revision 1.26  2003/01/09 19:53:45  tng * [Bug 15372] DOMBuilder::parseFromURI ignores result of handleErrors. * * Revision 1.25  2002/12/10 21:01:32  tng * NLS: DOMWriter should use message loader to load message instead of using hardcoded static stirng * * Revision 1.24  2002/12/10 18:59:14  tng * pretty format print: consistent newline * * Revision 1.23  2002/12/10 13:34:07  tng * Pretty-format print: also indent PI/comment that appear inside the root element. * * Revision 1.22  2002/12/09 11:46:08  gareth * More pretty pretty print feature. Patch by Kevin King. Closes bug #13840. * * Revision 1.21  2002/12/02 23:08:09  peiyongz * fix to bug#14528: output n+1 cdatasection * * Revision 1.20  2002/11/13 21:51:22  peiyongz * fix to Bug#14528 * * Revision 1.19  2002/11/04 15:07:35  tng * C++ Namespace Support. * * Revision 1.18  2002/10/03 18:13:38  peiyongz * Bug#12560 Use const in DOMWriter - patch from Duncan Stodart *                                                              (Duncan_Stodart@insession.com ) * * Revision 1.17  2002/09/24 20:19:14  tng * Performance: use XMLString::equals instead of XMLString::compareString * and check for null string directly isntead of calling XMLString::stringLen * * Revision 1.16  2002/09/09 15:42:14  peiyongz * Patch to Bug#12369: invalid output from DOMWriter using MemBufFormatTarget * * Revision 1.15  2002/08/07 18:10:19  peiyongz * Fix to Bug#11534: Wrong CDATA Terminator in DOMWriterImpl * * Revision 1.14  2002/07/22 23:24:01  tng * DOM L3: writeToString should use the fFormatter to do the transcoding * * Revision 1.13  2002/07/16 15:19:42  peiyongz * check lenght of getEncoding()/getActualEncoding() * * Revision 1.12  2002/06/25 16:17:16  tng * DOM L3: add release() * * Revision 1.11  2002/06/21 19:33:12  peiyongz * support for feature split_cdata_section and entities revised. * * Revision 1.10  2002/06/18 15:35:25  peiyongz * Bug#9950: Compilation error on MSVC5, patch from PeterV@ti.com.od.ua (Peter A. Volchek) * * Revision 1.9  2002/06/17 19:45:58  peiyongz * optimization on fFeatures and featureId introduced * * Revision 1.8  2002/06/11 19:45:45  peiyongz * Notify application of the XMLFormatter creation failure * * Revision 1.7  2002/06/10 16:02:21  peiyongz * format-pretty-print partially supported * resolve encoding from DOMDocument Interface * * Revision 1.6  2002/06/06 20:58:37  tng * [Bug 9639] enum_mem in DOMError clashes with constant. * * Revision 1.5  2002/06/05 16:03:03  peiyongz * delete[] used. * * Revision 1.4  2002/06/03 22:35:54  peiyongz * constants changed * * Revision 1.3  2002/05/31 21:01:06  peiyongz * move printing of XMLDecl into the processNode(). * * Revision 1.2  2002/05/29 21:31:50  knoaman * DOM L3 LS: DOMInputSource, DOMEntityResolver, DOMImplementationLS and DOMBuilder * * Revision 1.1  2002/05/28 22:39:39  peiyongz * DOM3 Save Interface: DOMWriter/DOMWriterFilter * */#include "DOMWriterImpl.hpp"#include "DOMErrorImpl.hpp"#include "DOMLocatorImpl.hpp"#include "DOMImplementationImpl.hpp"#include <xercesc/framework/MemBufFormatTarget.hpp>#include <xercesc/util/TransService.hpp>#include <xercesc/util/TranscodingException.hpp>#include <xercesc/util/Janitor.hpp>#include <xercesc/util/XMLString.hpp>#include <xercesc/util/XMLUniDefs.hpp>#include <xercesc/util/XMLMsgLoader.hpp>#include <xercesc/dom/StDOMNode.hpp>#include <xercesc/util/OutOfMemoryException.hpp>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------//  Local const data//// ---------------------------------------------------------------------------static const int INVALID_FEATURE_ID               = -1;static const int CANONICAL_FORM_ID                = 0x0;static const int DISCARD_DEFAULT_CONTENT_ID       = 0x1;static const int ENTITIES_ID                      = 0x2;static const int FORMAT_PRETTY_PRINT_ID           = 0x3;static const int NORMALIZE_CHARACTERS_ID          = 0x4;static const int SPLIT_CDATA_SECTIONS_ID          = 0x5;static const int VALIDATION_ID                    = 0x6;static const int WHITESPACE_IN_ELEMENT_CONTENT_ID = 0x7;static const int BYTE_ORDER_MARK_ID               = 0x8;static const int XML_DECLARATION                 = 0x9;//    feature                      true                       false// ================================================================================//canonical-form                 [optional] Not Supported     [required] (default)//discard-default-content        [required] (default)         [required]//entity                         [required] (default)         [optional]//format-pretty-print            [optional] Partially Supported [required] (default)//normalize-characters           [optional] Not Supported     [required] (default)//split-cdata-sections           [required] (default)         [required]//validation                     [optional] Not Supported     [required] (default)//whitespace-in-element-content  [requierd] (default)         [optional] Not Supported////// Each feature has 2 entries in this array,// the first for "true",// the second for "false".//static const bool  featuresSupported[] = {    false, true,  // canonical-form    true,  true,  // discard-default-content    true,  true,  // entity    true,  true,  // format-pretty-print    false, true,  // normalize-characters    true,  true,  // split-cdata-sections    false, true,  // validation    true,  false, // whitespace-in-element-content    true,  true,   // byte-order-mark    true,  true   // xml-declaration};// default end-of-line sequencestatic const XMLCh  gEOLSeq[] ={    chLF, chNull};//UTF-8static const XMLCh  gUTF8[] ={    chLatin_U, chLatin_T, chLatin_F, chDash, chDigit_8, chNull};//</static const XMLCh  gEndElement[] ={    chOpenAngle, chForwardSlash, chNull};//?>static const XMLCh  gEndPI[] ={    chQuestion, chCloseAngle, chNull};//<?static const XMLCh  gStartPI[] ={    chOpenAngle, chQuestion, chNull};//<?xml version="static const XMLCh  gXMLDecl_VersionInfo[] ={    chOpenAngle, chQuestion, chLatin_x,     chLatin_m,  chLatin_l,  chSpace,    chLatin_v,   chLatin_e,  chLatin_r,     chLatin_s,  chLatin_i,  chLatin_o,    chLatin_n,   chEqual,    chDoubleQuote, chNull};static const XMLCh gXMLDecl_ver10[] ={    chDigit_1, chPeriod, chDigit_0, chNull};//encoding="static const XMLCh  gXMLDecl_EncodingDecl[] ={    chLatin_e,  chLatin_n,  chLatin_c,  chLatin_o,      chLatin_d, chLatin_i,    chLatin_n,  chLatin_g,  chEqual,    chDoubleQuote,  chNull};//" standalone="static const XMLCh  gXMLDecl_SDDecl[] ={    chLatin_s, chLatin_t, chLatin_a,   chLatin_n,    chLatin_d,   chLatin_a,    chLatin_l, chLatin_o, chLatin_n,   chLatin_e,    chEqual,     chDoubleQuote,    chNull};//"static const XMLCh  gXMLDecl_separator[] ={    chDoubleQuote, chSpace, chNull};//?>static const XMLCh  gXMLDecl_endtag[] ={    chQuestion, chCloseAngle,  chNull};//<![CDATA[static const XMLCh  gStartCDATA[] ={    chOpenAngle, chBang,    chOpenSquare, chLatin_C, chLatin_D,    chLatin_A,   chLatin_T, chLatin_A,    chOpenSquare, chNull};//]]>static const XMLCh  gEndCDATA[] ={//    chCloseSquare, chCloseAngle, chCloseAngle, chNull  // test only: ]>>      chCloseSquare, chCloseSquare, chCloseAngle, chNull};static const int offset = XMLString::stringLen(gEndCDATA);//<!--static const XMLCh  gStartComment[] ={    chOpenAngle, chBang, chDash, chDash, chNull};//-->static const XMLCh  gEndComment[] ={    chDash, chDash, chCloseAngle, chNull};//<!DOCTYPEstatic const XMLCh  gStartDoctype[] ={    chOpenAngle, chBang,    chLatin_D, chLatin_O, chLatin_C, chLatin_T,    chLatin_Y,   chLatin_P, chLatin_E, chSpace,   chNull};//PUBLIC "static const XMLCh  gPublic[] ={    chLatin_P, chLatin_U, chLatin_B,     chLatin_L, chLatin_I,    chLatin_C, chSpace,   chDoubleQuote, chNull};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?