code: private PrefixedName readDTDQName(char firstChar)
          throws XMLStreamException
      {
          String prefix, localName;
  
          if (!mCfgNsEnabled) {
              prefix = null;
              localName = parseFullName(firstChar);
          } else {
              localName = parseLocalName(firstChar);
              /* Hmmh. This is tricky; should only read from the current
               * scope, but it is ok to hit end-of-block if it was a PE
               * expansion...
               */
              char c = dtdNextIfAvailable();
              if (c == CHAR_NULL) { // end-of-block
                  // ok, that's it...
                  prefix = null;
              } else {
                  if (c == ':') { // Ok, got namespace and local name
                      prefix = localName;
                      c = dtdNextFromCurr();
                      localName = parseLocalName(c);
                  } else {
                      prefix = null;
                      --mInputPtr;
                  }
              }
          }
  
          return findSharedName(prefix, localName);
      }
docs: Method that will read an element or attribute name from DTD; depending
  on namespace mode, it can have prefix as well.
  <p>
  Note: returned {@link PrefixedName} instances are canonicalized so that
  all instances read during parsing of a single DTD subset so that
  identity comparison can be used instead of calling <code>equals()</code>
  method (but only within a single subset!). This also reduces memory
  usage to some extent.