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