xmlwriter.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 874 行 · 第 1/2 页

JAVA
874
字号
/* * Copyright (c) 1998-2005 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.quercus.lib.xml;import com.caucho.quercus.annotation.*;import com.caucho.quercus.env.*;import com.caucho.util.L10N;import com.caucho.vfs.*;import java.io.*;import java.util.*;import java.util.logging.*;/** * XMLWriter */public class XMLWriter {  private static final Logger log    = Logger.getLogger(XMLWriter.class.getName());  private static final L10N L = new L10N(XMLWriter.class);  private static final XMLWriterStream NULL_STREAM = new XMLWriterStream();  private XMLWriterStream _s = NULL_STREAM;  private WriterState _state = WriterState.TOP;  private HashMap<StringValue,StringValue> _nsMap    = new HashMap<StringValue,StringValue>();  private ArrayList<StringValue> _elementStack    = new ArrayList<StringValue>();  private ArrayList<ArrayList<StringValue>> _nsStack    = new ArrayList<ArrayList<StringValue>>();  /**   * Default constructor   */  public XMLWriter()  {  }  /**   * Flushes the output and returns the result.   */  public Value flush()  {    return _s.flush();  }  /**   * Opens the writer for a memory target   */  public boolean openMemory(Env env)  {    StringValue s = env.createUnicodeBuilder();        _s = new MemoryXMLWriterStream(s);    _nsMap.clear();    _elementStack.clear();    _nsStack.clear();        _state = WriterState.TOP;        return true;  }  /**   * Opens the writer for a uri target   */  public boolean openURI(Env env, Path path)  {    try {      WriteStream out = path.openWrite();      _s = new PathXMLWriterStream(out);      _nsMap.clear();      _elementStack.clear();      _nsStack.clear();            _state = WriterState.TOP;    } catch (IOException e) {      log.log(Level.WARNING, e.toString(), e);    }        return true;  }  /**   * Returns the memory result   */  public Value outputMemory()  {    return flush();  }  /**   * Ends an attribute   */  public boolean endAttribute()  {    if (_state != WriterState.ATTRIBUTE)      return false;        _s.append("\"");    _state = WriterState.ELEMENT_HEADER;    return true;  }  /**   * Starts a CData section   */  public boolean endCData()  {    if (_state != WriterState.CDATA)      return false;    _state = WriterState.ELEMENT_BODY;    _s.append("]]>");    return true;  }  /**   * Starts a comment section   */  public boolean endComment()  {    if (_state != WriterState.COMMENT)      return false;    _state = WriterState.ELEMENT_BODY;    _s.append("-->");    return true;  }  /**   * Ends a pi section   */  public boolean endPI()  {    if (_state != WriterState.PI)      return false;    _state = WriterState.ELEMENT_BODY;    _s.append("?>");    return true;  }  /**   * Ends the document   */  public boolean endDocument()  {    return true;  }  /**   * Ends a DTD attribute list   */  public boolean endDTDAttlist()  {    return true;  }  /**   * Ends a DTD element list   */  public boolean endDTDElement()  {    return true;  }  /**   * Ends a DTD entity   */  public boolean endDTDEntity()  {    return true;  }  /**   * Ends a DTD   */  public boolean endDTD()  {    return true;  }  /**   * Ends an element   */  public boolean endElement(Env env)  {    if (_state == WriterState.ATTRIBUTE)      endAttribute();        if (_elementStack.size() == 0)      return false;    else if (_state == WriterState.ELEMENT_HEADER) {      popElement();      _s.append("/>");      return true;    }    else if (_state == WriterState.ELEMENT_BODY) {      StringValue name = popElement();      _s.append("</").append(env, name).append(">");            return true;    }    else      return false;  }  /**   * Ends an element   */  public boolean endElementNS(Env env)  {    return endElement(env);  }  /**   * Ends an element   */  public boolean fullEndElement(Env env)  {    if (_state == WriterState.ATTRIBUTE)      endAttribute();        if (_elementStack.size() == 0)      return false;        if (_state == WriterState.ELEMENT_HEADER) {      _s.append(">");    }    else if (_state != WriterState.ELEMENT_BODY)      return false;        StringValue name = popElement();    _s.append("</").append(env, name).append(">");    return true;  }  /**   * enables indentation   */  public boolean setIndent(boolean isIndent)  {    return false;  }  /**   * sets the indentation string   */  public boolean setIndentString(StringValue value)  {    return false;  }  /**   * Starts an attribute   */  public boolean startAttribute(Env env, StringValue name)  {    if (_state != WriterState.ELEMENT_HEADER)      return false;        _s.append(" ").append(env, name).append("=\"");    _state = WriterState.ATTRIBUTE;    return true;  }  /**   * Starts an attribute with a namespace   */  public boolean startAttributeNS(Env env,				  StringValue prefix,				  StringValue name,				  StringValue uri)  {    if (_state != WriterState.ELEMENT_HEADER)      return false;    pushNamespace(env, prefix, uri);        _s.append(" ").append(env, prefix).append(":").append(env,name);    _s.append("=\"");    _state = WriterState.ATTRIBUTE;    return true;  }  /**   * Starts a CData section   */  public boolean startCData()  {    startContent();    _state = WriterState.CDATA;    _s.append("<![CDATA[");    return true;  }  /**   * Starts a comment section   */  public boolean startComment()  {    startContent();    _state = WriterState.COMMENT;    _s.append("<!--");    return true;  }  /**   * Starts the document   */  public boolean startDocument(Env env,			       @Optional StringValue version,			       @Optional StringValue encoding,			       @Optional StringValue standalone)  {    _s.append("<?xml");        if (version == null || version.length() == 0)      _s.append(" version=\"1.0\"");    else      _s.append(" version=\"").append(env, version).append("\"");        if (encoding != null && encoding.length() != 0)      _s.append(" encoding=\"").append(env, encoding).append("\"");        if (standalone != null && standalone.length() != 0)      _s.append(" standalone=\"").append(env, standalone).append("\"");    _s.append("?>\n");    return true;  }  /**   * Starts a DTD attribute list   */  public boolean startDTDAttlist(StringValue name)  {    return true;  }  /**   * Starts a DTD element list   */  public boolean startDTDElement(StringValue name)  {    return true;  }  /**   * Starts a DTD entity   */  public boolean startDTDEntity(StringValue name)  {    return true;  }  /**   * Starts a DTD   */  public boolean startDTD(StringValue name,			  @Optional StringValue publicId,			  @Optional StringValue systemId)  {    return true;  }  /**   * Starts an element   */  public boolean startElement(Env env, StringValue name)  {    if (_state == WriterState.ELEMENT_HEADER) {      _s.append(">");    }    _s.append("<").append(env, name);    _elementStack.add(name);

⌨️ 快捷键说明

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