xmlreaderimpl.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 866 行 · 第 1/2 页
JAVA
866 行
_contentHandler.startElement("", "", name, _attributes); parseContent(); InternQName tailQName = parseName(); String tailName = tailQName.getName(); if ((ch = read()) != '>') throw error("XXX: expected '>'"); if (! name.equals(tailName)) throw error("XXX: mismatch name"); _contentHandler.endElement("", "", name); return; default: if (XmlChar.isNameStart(ch)) { unread(); InternQName attrName = parseName(); ch = skipWhitespace(read()); if (ch != '=') throw error(L.l("Expected '=' for attribute value at {0}.", badChar(ch))); String attrValue = parseValue(); _attributes.add(attrName, attrValue); } else throw error(L.l("{0} is an unexpected character in element.", badChar(ch))); } } } /** * Parses a name. */ private QName parseAttrName() throws IOException { int valueOffset = 0; char []inputBuf = _inputBuf; char []valueBuf = _valueBuf; int inputLength = _inputLength; int inputOffset = _inputOffset; while (true) { if (inputOffset < inputLength) { } else if (fillBuffer()) { inputLength = _inputLength; inputOffset = 0; } else { _nameKey.init(valueBuf, 0, valueOffset); QName name = _nameMap.get(_nameKey); if (name == null) { name = new QName(new String(valueBuf, 0, valueOffset), null); _nameMap.put(new NameKey(valueBuf, 0, valueOffset), name); } return name; } char ch = inputBuf[inputOffset++]; if (XML_NAME_CHAR[ch]) valueBuf[valueOffset++] = ch; else if (ch == ':') { valueBuf[valueOffset++] = ch; } else { _inputOffset = inputOffset - 1; QName name = _nameMap.get(_nameKey); if (name == null) { name = new QName(new String(valueBuf, 0, valueOffset), null); _nameMap.put(new NameKey(valueBuf, 0, valueOffset), name); } return name; } } } /** * Parses a name. */ private InternQName parseName() throws IOException { int valueOffset = 0; char []inputBuf = _inputBuf; char []valueBuf = _valueBuf; int inputLength = _inputLength; int inputOffset = _inputOffset; int colon = 0; while (true) { if (inputOffset < inputLength) { char ch = inputBuf[inputOffset++]; if (XML_NAME_CHAR[ch]) { valueBuf[valueOffset++] = ch; } else if (ch == ':') { if (colon <= 0) colon = valueOffset; valueBuf[valueOffset++] = ch; } else { _inputOffset = inputOffset - 1; return _intern.add(valueBuf, 0, valueOffset, colon); } } else if (fillBuffer()) { inputLength = _inputLength; inputOffset = 0; } else { return _intern.add(valueBuf, 0, valueOffset, colon); } } } /** * Writes text data. */ private void writeText(char []buffer, int length, boolean isWhitespace) throws SAXException { } /** * Adds the line for cr */ private void addCarriageReturnLine() throws IOException { if (_inputLength == _inputOffset && ! fillBuffer()) _line++; else if (_inputBuf[_inputOffset] != '\n') _line++; } /** * Parses an attribute value. */ private String parseValue() throws IOException, SAXException { int end = skipWhitespace(read()); if (end != '\'' && end != '"') throw error(L.l("expected quote at '{0}'", badChar(end))); int index = 0; char []inputBuf = _inputBuf; char []valueBuf = _valueBuf; while (true) { if (_inputLength == _inputOffset && ! fillBuffer()) throw error(L.l("Unexpected end of file in attribute value.")); char ch = inputBuf[_inputOffset++]; switch (ch) { case '&': throw error(L.l("Can't handle entities yet.")); case '\r': addCarriageReturnLine(); ch = ' '; break; case '\n': _line++; ch = ' '; break; case '\'': case '"': if (ch == end) return new String(valueBuf, 0, index); break; } valueBuf[index++] = ch; } } /** * Skips whitespace, returning the next character. */ private int skipWhitespace(int ch) throws IOException { while (true) { switch (ch) { case -1: return -1; case ' ': case '\t': break; case '\r': addCarriageReturnLine(); break; case '\n': _line++; break; default: return ch; } if (_inputLength == _inputOffset && ! fillBuffer()) return -1; ch = _inputBuf[_inputOffset++]; } } /** * Reads a character. */ private int read() throws IOException { if (_inputLength == _inputOffset && ! fillBuffer()) return -1; else return _inputBuf[_inputOffset++]; } /** * Reads a character. */ private void unread() throws IOException { _inputOffset--; } /** * Fills the input buffer. */ private boolean fillBuffer() throws IOException { _inputOffset = 0; _inputLength = _reader.read(_inputBuf, 0, _inputBuf.length); return _inputLength > 0; } /** * Returns a string for a bad char. */ private String badChar(int ch) { return "" + (char) ch; } /** * Returns an error. */ private SAXException error(String msg) { return new SAXException(msg); } class LocatorImpl implements ExtendedLocator { /** * Returns the parser's system id. */ public String getSystemId() { return _systemId; /* if (_parser._reader != null && _parser._reader.getSystemId() != null) return _parser._reader.getSystemId(); else if (_parser.getSystemId() != null) return _parser.getSystemId(); else if (_parser._reader != null && _parser._reader.getFilename() != null) return _parser._reader.getFilename(); else if (_parser.getFilename() != null) return _parser.getFilename(); else return null; */ } /** * Returns the parser's filename. */ public String getFilename() { return _filename; /* if (_parser._reader != null && _parser._reader.getFilename() != null) return _parser._reader.getFilename(); else if (_parser.getFilename() != null) return _parser.getFilename(); else if (_parser._reader != null && _parser._reader.getSystemId() != null) return _parser._reader.getSystemId(); else if (_parser.getSystemId() != null) return _parser.getSystemId(); else return null; */ } /** * Returns the public id. */ public String getPublicId() { return _publicId; /* if (_parser._reader != null) return _parser._reader.getPublicId(); else return _parser.getPublicId(); */ } /** * Returns the line number. */ public int getLineNumber() { return _line; /* if (_parser._reader != null) return _parser._reader.getLine(); else return _parser.getLineNumber(); */ } /** * Returns the column. */ public int getColumnNumber() { return -1; } } static class NameKey { char []_buf; int _offset; int _length; NameKey() { } NameKey(char []buf, int offset, int length) { _buf = new char[length]; System.arraycopy(buf, offset, _buf, 0, length); _offset = 0; _length = 0; } void init(char []buf, int offset, int length) { _buf = buf; _offset = offset; _length = length; } @Override public int hashCode() { int hash = 37; char buf[] = _buf; for (int i = _length - 1; i >= 0; i--) hash = 65537 * hash + buf[i]; return hash; } @Override public boolean equals(Object o) { NameKey key = (NameKey) o; int length = _length; if (length != key._length) return false; char []aBuf = _buf; char []bBuf = key._buf; int aOffset = _offset; int bOffset = key._offset; for (int i = 0; i < length; i++) { if (aBuf[aOffset + i] != bBuf[bOffset + i]) return false; } return true; } } static { XML_NAME_CHAR = new boolean[65536]; for (int i = 0; i < 65536; i++) { XML_NAME_CHAR[i] = XmlChar.isNameChar(i) && i != ':'; } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?