xml.java

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

JAVA
1,012
字号
  /**   *   * @param option   * @return relevant value   */  public Value xml_parser_get_option(int option)  {    switch (option) {    case XmlModule.XML_OPTION_CASE_FOLDING:      return (_xmlOptionCaseFolding ? LongValue.ONE : LongValue.ZERO);    case XmlModule.XML_OPTION_SKIP_TAGSTART:      return LongValue.create(_xmlOptionSkipTagstart);    case XmlModule.XML_OPTION_SKIP_WHITE:      return (_xmlOptionSkipWhite ? LongValue.ONE : LongValue.ZERO);    case XmlModule.XML_OPTION_TARGET_ENCODING:      return _env.createString(_xmlOptionTargetEncoding);    default:      return BooleanValue.FALSE;    }  }  public String toString()  {    return "Xml[]";  }  /**   * handler solely for xml_parse_into_struct   */  class StructHandler extends DefaultHandler {    private ArrayValueImpl _valueArray;    private ArrayValueImpl _indexArray;    //Keeps track of depth within tree;    //startElement increments, endElement decrements    private int _level = 1;    private HashMap<Integer, String> _paramHashMap = new HashMap<Integer, String> ();    private HashMap<StringValue, ArrayValueImpl> _indexArrayHashMap = new HashMap<StringValue, ArrayValueImpl>();    private ArrayList<StringValue> _indexArrayKeys = new ArrayList<StringValue>();    // Used to determine whether a given element has sub elements    private boolean _isComplete = true;    private boolean _isOutside = true;    private int _valueArrayIndex = 0;    private Locator _locator;    public StructHandler(ArrayValueImpl valueArray,                         ArrayValueImpl indexArray)    {      _valueArray = valueArray;      _indexArray = indexArray;    }    public void setDocumentLocator(Locator locator)    {      _locator = locator;    }    public int getLine()    {      if (_locator != null)	return _locator.getLineNumber();      else	return 0;    }    public int getColumn()    {      if (_locator != null)	return _locator.getColumnNumber();      else	return 0;    }    /**     * helper function to create an array of attributes for a tag     * @param attrs     * @return array of attributes     */    private ArrayValueImpl createAttributeArray(Attributes attrs)    {      ArrayValueImpl result = new ArrayValueImpl();      // turn attrs into an array of name, value pairs      for (int i = 0; i < attrs.getLength(); i++) {        String aName = attrs.getLocalName(i); // Attr name        if ("".equals(aName)) aName = attrs.getQName(i);        if (_xmlOptionCaseFolding) aName = aName.toUpperCase();        result.put(_env.createString(aName), _env.createString(attrs.getValue(i)));      }      return result;    }    public void endDocument()      throws SAXException    {      for(StringValue sv : _indexArrayKeys) {        _indexArray.put(sv, _indexArrayHashMap.get(sv));      }    }    public void startElement(String namespaceURI,                             String lName,                             String qName,                             Attributes attrs)      throws SAXException    {      Value elementArray = new ArrayValueImpl();      String eName = lName; // element name      if ("".equals(eName)) eName = qName;      if (_xmlOptionCaseFolding) eName = eName.toUpperCase();      elementArray.put(_env.createString("tag"), _env.createString(eName));      elementArray.put(_env.createString("type"), _env.createString("open"));      elementArray.put(_env.createString("level"), LongValue.create(_level));      _paramHashMap.put(_level, eName);      if (attrs.getLength() > 0) {        elementArray.put(_env.createString("attributes"), createAttributeArray(attrs));      }      _valueArray.put(LongValue.create(_valueArrayIndex), elementArray);      addToIndexArrayHashMap(eName);      _valueArrayIndex++;      _level++;      _isComplete = true;      _isOutside = false;    }    public void endElement(String namespaceURI,                           String sName,                           String qName)      throws SAXException    {      Value elementArray;      _level--;      if (_isComplete) {        elementArray = _valueArray.get(LongValue.create(_valueArrayIndex - 1));        elementArray.put(_env.createString("type"), _env.createString("complete"));      } else {        elementArray = new ArrayValueImpl();        String eName = sName; // element name        if ("".equals(sName)) eName = qName;        if (_xmlOptionCaseFolding) eName = eName.toUpperCase();        elementArray.put(_env.createString("tag"), _env.createString(eName));        elementArray.put(_env.createString("type"), _env.createString("close"));        elementArray.put(_env.createString("level"), LongValue.create(_level));        _valueArray.put(LongValue.create(_valueArrayIndex), elementArray);        addToIndexArrayHashMap(eName);        _valueArrayIndex++;      }      _isComplete = false;      _isOutside = true;    }    private void addToIndexArrayHashMap(String eName)    {      StringValue key = _env.createString(eName);      ArrayValueImpl indexArray = _indexArrayHashMap.get(key);      if (indexArray == null) {        indexArray = new ArrayValueImpl();        _indexArrayKeys.add(key);      }      indexArray.put(LongValue.create(_valueArrayIndex));      _indexArrayHashMap.put(key, indexArray);    }    public void characters(char[] ch,                           int start,                           int length)      throws SAXException    {      String s = new String(ch, start, length);      if (_isOutside) {        Value elementArray = new ArrayValueImpl();        elementArray.put(_env.createString("tag"), _env.createString(_paramHashMap.get(_level - 1)));        elementArray.put(_env.createString("value"), _env.createString(s));        elementArray.put(_env.createString("type"), _env.createString("cdata"));        elementArray.put(_env.createString("level"), LongValue.create(_level - 1));        _valueArray.put(LongValue.create(_valueArrayIndex), elementArray);        Value indexArray = _indexArray.get(_env.createString(_paramHashMap.get(_level - 1)));        indexArray.put(LongValue.create(_valueArrayIndex));        _valueArrayIndex++;      } else {        Value elementArray = _valueArray.get(LongValue.create(_valueArrayIndex - 1));        elementArray.put(_env.createString("value"), _env.createString(s));      }    }  }  class XmlHandler extends DefaultHandler {    private Locator _locator;    public void setDocumentLocator(Locator locator)    {      _locator = locator;    }    public int getLine()    {      if (_locator != null)	return _locator.getLineNumber();      else	return 0;    }    public int getColumn()    {      if (_locator != null)	return _locator.getColumnNumber();      else	return 0;    }    /**     * wrapper for _startElementHandler.  creates Value[] args     *     * @param namespaceURI     * @param lName     * @param qName     * @param attrs     * @throws SAXException     */    public void startElement(String namespaceURI,                             String lName,                             String qName,                             Attributes attrs)      throws SAXException    {      /**       *  args[0] reference to this parser       *  args[1] name of element       *  args[2] array of attributes       *       *  Typical call in PHP looks like:       *       *  function startElement($parser, $name, $attrs) {...}       */      Value[] args = new Value[3];      args[0] = _parser;      String eName = lName; // element name      if ("".equals(eName))	eName = qName;            if (_xmlOptionCaseFolding)	eName = eName.toUpperCase();            args[1] = _env.createString(eName);      // turn attrs into an array of name, value pairs      args[2] = new ArrayValueImpl();      for (int i = 0; i < attrs.getLength(); i++) {        String aName = attrs.getLocalName(i); // Attr name	        if ("".equals(aName))	  aName = attrs.getQName(i);	        if (_xmlOptionCaseFolding)	  aName = aName.toUpperCase();	        args[2].put(_env.createString(aName), _env.createString(attrs.getValue(i)));      }      try {        if (_startElementHandler != null)          _startElementHandler.call(_env, args);        else {          if (log.isLoggable(Level.FINER))            log.finer(this + " startElement " + qName);        }      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    /**     * wrapper for _endElementHandler     *     * @param namespaceURI     * @param sName     * @param qName     * @throws SAXException     */    public void endElement(String namespaceURI,                           String sName,                           String qName)      throws SAXException    {      try {        String eName = sName; // element name        if ("".equals(eName)) eName = qName;        if (_xmlOptionCaseFolding) eName = eName.toUpperCase();        if (_endElementHandler != null)          _endElementHandler.call(_env, _parser, _env.createString(eName));        else {	  if (log.isLoggable(Level.FINER))	    log.finer(this + " endElement " + sName);	}      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    /**     * wrapper for _characterDataHandler     *     * @param ch     * @param start     * @param length     * @throws SAXException     */    public void characters(char[] buf,                           int start,                           int length)      throws SAXException    {      StringValue value;            if (_env.isUnicodeSemantics()) {        value = _env.createString(buf, start, length);      }      else {        String s = new String(buf, start, length);                byte[] bytes;                try {          bytes = s.getBytes(_xmlOptionTargetEncoding);        } catch (UnsupportedEncodingException e) {          throw new QuercusException(e);        }        value = _env.createStringBuilder();                value.append(bytes);      }      try {        if (_characterDataHandler != null)          _characterDataHandler.call(_env, _parser, value);        else if (_defaultHandler != null)          _defaultHandler.call(_env, _parser, value);        else {          if (log.isLoggable(Level.FINER))            log.finer(this + " characters '" + value + "'");        }      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    /**     * wrapper for _processingInstructionHandler     * @param target     * @param data     * @throws SAXException     */    public void processingInstruction(String target,                                      String data)      throws SAXException    {      try {        if (_processingInstructionHandler != null) {          _processingInstructionHandler.call(_env, _parser,					     _env.createString(target),					     _env.createString(data));	}        else {	  if (log.isLoggable(Level.FINER))	    log.finer(this + " processingInstruction " + target);	}      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    /**     * wrapper for _startNamespaceDeclHandler     * @param prefix     * @param uri     * @throws SAXException     */    public void startPrefixMapping (String prefix,                                    String uri)      throws SAXException    {      try {        if (_startNamespaceDeclHandler != null)          _startNamespaceDeclHandler.call(_env, _env.createString(prefix), _env.createString(uri));        else {	  if (log.isLoggable(Level.FINER))	    log.finer(this + " startPrefixMapping " + prefix + " " + uri);	}      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    /**     * wrapper for _endNamespaceDeclHandler     *     * @param prefix     * @throws SAXException     */    public void endPrefixMapping(String prefix)      throws SAXException    {      try {        if (_endNamespaceDeclHandler != null)          _endNamespaceDeclHandler.call(_env, _env.createString(prefix));        else {	  if (log.isLoggable(Level.FINER))	    log.finer(this + " endPrefixMapping");	}      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    public void notationDecl(String name,                             String publicId,                             String systemId)      throws SAXException    {      try {        if (_notationDeclHandler != null)          _notationDeclHandler.call(_env,                                    _parser,                                    _env.createString(name),                                    _env.createString(""),                                    _env.createString(systemId),                                    _env.createString(publicId));        else {	  if (log.isLoggable(Level.FINER))	    log.finer(this + " notation " + name);	}      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }    @Override    public void unparsedEntityDecl(String name,                                   String publicId,                                   String systemId,                                   String notationName)      throws SAXException    {      /**       * args[0] reference to this parser       * args[1] name       * args[2] base (always "")       * args[3] systemId       * args[4] publicId       * args[5] notationName       */      Value[] args = new Value[6];      args[0] = _parser;      args[1] = _env.createString(name);      args[2] = _env.createString("");      args[3] = _env.createString(systemId);      args[4] = _env.createString(publicId);      args[5] = _env.createString(notationName);      try {        if (_unparsedEntityDeclHandler != null)          _unparsedEntityDeclHandler.call(_env, args);        else {	  if (log.isLoggable(Level.FINER))	    log.finer(this + " unparsedEntity " + name);	}      } catch (Exception t) {        log.log(Level.FINE, t.toString(), t);        throw new SAXException(L.l(t.getMessage()));      }    }  }}

⌨️ 快捷键说明

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