code: private void handleAttlistDecl()
          throws XMLStreamException
      {
          /* This method will handle PEs that contain the whole element
           * name. Since it's illegal to have partials, we can then proceed
           * to just use normal parsing...
           */
          char c = skipObligatoryDtdWs();
          final PrefixedName elemName = readDTDQName(c);
  
          /* Ok, event needs to know its exact starting point (opening '<'
           * char), let's get that info now (note: data has been preserved
           * earlier)
           */
          Location loc = getStartLocation();
  
          // Ok, where's our element?
          HashMap<PrefixedName,DTDElement> m = getElementMap();
          DTDElement elem = m.get(elemName);
  
          if (elem == null) { // ok, need a placeholder
              // Let's add ATTLIST location as the temporary location too
              elem = DTDElement.createPlaceholder(mConfig, loc, elemName);
              m.put(elemName, elem);
          }
  
          // Ok, need to loop to get all attribute defs:
          int index = 0;
  
          while (true) {
              /* White space is optional, if we get the closing '>' char;
               * otherwise it's obligatory.
               */
              c = getNextExpanded();
              if (isSpaceChar(c)) {
                  // Let's push it back in case it's LF, to be handled properly
                  --mInputPtr;
                  c = skipDtdWs(true);
  
                  /* 26-Jan-2006, TSa: actually there are edge cases where
                   *   we may get the attribute name right away (esp.
                   *   with PEs...); so let's defer possible error for
                   *   later on. Should not allow missing spaces between
                   *   attribute declarations... ?
                   */
                  /*
              } else if (c != '>') {
                  throwDTDUnexpectedChar(c, "; excepted either '>' closing ATTLIST declaration, or a white space character separating individual attribute declarations");
                  */
              }
              if (c == '>') {
                  break;
              }
              handleAttrDecl(elem, c, index, loc);
              ++index;
          }
      }
docs: note: when this method is called, the keyword itself has
  been succesfully parsed.