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("<"); break; case '>': _s.append(">"); break; case '&': _s.append("&"); break; case '"': _s.append("""); 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 + -
显示快捷键?