xmlwriter.java

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

JAVA
874
字号
    _nsStack.add(null);    _state = WriterState.ELEMENT_HEADER;    return true;  }  /**   * Starts a namespaced element   */  public boolean startElementNS(Env env,				StringValue prefix,				StringValue name,				StringValue uri)  {    startContent();    _s.append("<").append(env, prefix).append(":").append(env, name);    StringValue endName = prefix.createStringBuilder();    endName.append(prefix).append(":").append(name);        _elementStack.add(endName);        _nsStack.add(null);    pushNamespace(env, prefix, uri);    _state = WriterState.ELEMENT_HEADER;    return true;  }  /**   * Starts a processing instruction section   */  public boolean startPI(Env env, StringValue target)  {    startContent();    _state = WriterState.PI;    _s.append("<?").append(env, target).append(" ");    return true;  }  /**   * Writes text   */  public boolean text(Env env, StringValue text)  {    if (_state == WriterState.ELEMENT_HEADER)      startContent();    if (_state == WriterState.ELEMENT_BODY || _state == WriterState.TOP) {      int len = text.length();      for (int i = 0; i < len; i++) {	char ch = text.charAt(i);	switch (ch) {	case '<':	  _s.append("&lt;");	  break;	case '>':	  _s.append("&gt;");	  break;	case '&':	  _s.append("&amp;");	  break;	case '"':	  _s.append("&quot;");	  break;	default:	  _s.append(ch);	  break;	}      }    }    else      _s.append(env, text);    return true;  }  /**   * Writes a complete attribute   */  public boolean writeAttribute(Env env, StringValue name,				StringValue value)  {    startAttribute(env, name);    text(env, value);    endAttribute();    return true;  }  /**   * Writes a complete attribute   */  public boolean writeAttributeNS(Env env,				  StringValue prefix,				  StringValue name,				  StringValue uri,				  StringValue value)  {    startAttributeNS(env, prefix, name, uri);    text(env, value);    endAttribute();    return true;  }  /**   * Writes a complete cdata   */  public boolean writeCData(Env env, StringValue value)  {    startCData();    text(env, value);    endCData();    return true;  }  /**   * Writes a complete comment   */  public boolean writeComment(Env env, StringValue value)  {    startComment();    text(env, value);    endComment();    return true;  }  /**   * Writes a DTD attribute list   */  public boolean writeDTDAttlist(Env env,				 StringValue name,				 StringValue content)  {    startDTDAttlist(name);    text(env, content);    endDTDAttlist();    return true;  }  /**   * Writes a DTD element   */  public boolean writeDTDElement(Env env,				 StringValue name,				 StringValue content)  {    startDTDElement(name);    text(env, content);    endDTDElement();    return true;  }  /**   * Writes a DTD entity   */  public boolean writeDTDEntity(Env env,				StringValue name,				StringValue content)  {    startDTDEntity(name);    text(env, content);    endDTDEntity();    return true;  }  /**   * Writes a DTD   */  public boolean writeDTD(Env env,			  StringValue name,			  @Optional StringValue publicId,			  @Optional StringValue systemId,			  @Optional StringValue subset)  {    startDTD(name, publicId, systemId);    text(env, subset);    endDTDEntity();    return true;  }  /**   * Writes a complete element   */  public boolean writeElement(Env env,			      StringValue name,			      @Optional StringValue content)  {    startElement(env, name);    if (content != null && content.length() > 0)      text(env, content);        endElement(env);    return true;  }  /**   * Writes a complete element   */  public boolean writeElementNS(Env env,				StringValue prefix,				StringValue name,				StringValue uri,				@Optional StringValue content)  {    startElementNS(env, prefix, name, uri);    if (content != null && content.length() > 0)      text(env, content);    endElement(env);    return true;  }  /**   * Writes a pi   */  public boolean writePI(Env env, StringValue name, StringValue value)  {    startPI(env, name);    text(env, value);    endPI();    return true;  }  /**   * Writes raw text   */  public boolean writeRaw(Env env, StringValue value)  {    _s.append(env, value);    return true;  }  private void startContent()  {    if (_state == WriterState.ATTRIBUTE) {      _s.append("\">");            _state = WriterState.ELEMENT_BODY;    }    else if (_state == WriterState.ELEMENT_HEADER) {      _s.append(">");      _state = WriterState.ELEMENT_BODY;    }  }  private void pushNamespace(Env env, StringValue prefix, StringValue uri)  {    if (! uri.equals(_nsMap.get(prefix))) {      _s.append(" ");            if (prefix.length() == 0)	_s.append("xmlns");      else	_s.append("xmlns:").append(env, prefix);      _s.append("=\"").append(env, uri).append("\"");      ArrayList<StringValue> stack = _nsStack.get(_nsStack.size() - 1);            if (stack == null) {	stack = new ArrayList<StringValue>();	_nsStack.set(_nsStack.size() - 1, stack);      }      stack.add(prefix);      _nsMap.put(prefix, uri);    }  }  private StringValue popElement()  {    if (_elementStack.size() > 1)      _state = WriterState.ELEMENT_BODY;    else      _state = WriterState.TOP;        if (_elementStack.size() > 0) {      StringValue name = _elementStack.remove(_elementStack.size() - 1);            ArrayList<StringValue> prefixList = _nsStack.remove(_nsStack.size() - 1);      if (prefixList != null) {	for (StringValue prefix : prefixList) {	  _nsMap.remove(prefix);	}      }      return name;    }    return null;  }  @Override  public String toString()  {    return getClass().getSimpleName() + "[]";  }  static enum WriterState {    TOP,    ELEMENT_HEADER,    ATTRIBUTE,    COMMENT,    CDATA,    ELEMENT_BODY,    PI;  }        static class XMLWriterStream {    XMLWriterStream append(char v) { return this; }        XMLWriterStream append(Env env, StringValue v) { return this; }        XMLWriterStream append(String v) { return this; }    Value flush() { return NullValue.NULL; }  }  static class MemoryXMLWriterStream extends XMLWriterStream {    private StringValue _v;    MemoryXMLWriterStream(StringValue v)    {      _v = v;    }        @Override    XMLWriterStream append(char v)    {      _v.append(v);      return this;    }        @Override      XMLWriterStream append(Env env, StringValue v)    {      _v.append(v);      return this;    }        @Override    XMLWriterStream append(String text)    {      _v.append(text);      return this;    }    @Override    Value flush()    {      return _v;    }  }  static class PathXMLWriterStream extends XMLWriterStream {    private WriteStream _out;    PathXMLWriterStream(WriteStream out)    {      _out = out;    }        @Override    XMLWriterStream append(char v)    {      try {	_out.print(v);      } catch (IOException e) {	log.log(Level.WARNING, e.toString(), e);      }      return this;    }    @Override    XMLWriterStream append(Env env, StringValue v)    {      v.print(env, _out);      return this;    }        @Override    XMLWriterStream append(String text)    {      try {	_out.print(text);      } catch (IOException e) {	log.log(Level.WARNING, e.toString(), e);      }      return this;    }    @Override    Value flush()    {      try {	_out.close();      } catch (IOException e) {	log.log(Level.WARNING, e.toString(), e);      }            return LongValue.create(1);    }  }}

⌨️ 快捷键说明

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