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 + -
显示快捷键?