code: public static Vector getQNameProperties(String key, Properties props)
    {
  
      String s = props.getProperty(key);
  
      if (null != s)
      {
        Vector v = new Vector();
        int l = s.length();
        boolean inCurly = false;
        FastStringBuffer buf = new FastStringBuffer();
  
        // parse through string, breaking on whitespaces.  I do this instead 
        // of a tokenizer so I can track whitespace inside of curly brackets, 
        // which theoretically shouldn't happen if they contain legal URLs.
        for (int i = 0; i < l; i++)
        {
          char c = s.charAt(i);
  
          if (Character.isWhitespace(c))
          {
            if (!inCurly)
            {
              if (buf.length() > 0)
              {
                QName qname = QName.getQNameFromString(buf.toString());
                v.addElement(qname);
                buf.reset();
              }
              continue;
            }
          }
          else if ('{' == c)
            inCurly = true;
          else if ('}' == c)
            inCurly = false;
  
          buf.append(c);
        }
  
        if (buf.length() > 0)
        {
          QName qname = QName.getQNameFromString(buf.toString());
          v.addElement(qname);
          buf.reset();
        }
  
        return v;
      }
      else
        return null;
    }
docs: Searches for the list of qname properties with the specified key in
  the property list.
  If the key is not found in this property list, the default property list,
  and its defaults, recursively, are then checked. The method returns
  <code>null</code> if the property is not found.
  
  @param   key   the property key.
  @param props the list of properties to search in.
  @return  the value in this property list as a vector of QNames, or false
  if null or not "yes".