docs: @FFDCIgnore(XMLStreamException.class)
      public void parse(ParsableElement parsable) throws ParseException {
          QName elementName = xsr.getName();
          String elementLocalName = xsr.getLocalName();
          currentElementLocalName = elementLocalName;
          int attrCount = xsr.getAttributeCount();
          for (int i = 0; i < attrCount; i++) {
              String attrNS = xsr.getAttributeNamespace(i);
              String attrLocal = xsr.getAttributeLocalName(i);
              if (parsable.isIdAllowed() && "id".equals(attrLocal)) {
                  if (idNamespace != null) {
                      if (!idNamespace.equals(attrNS)) {
                          throw new ParseException(incorrectIDAttrNamespace(attrNS));
                      }
                  } else if (attrNS != null) {
                      throw new ParseException(incorrectIDAttrNamespace(attrNS));
                  }
                  IDType idKey = parseIDAttributeValue(i);
                  String key = idKey.getValue();
                  Object oldValue = idMap.get(key);
                  if (oldValue == null) {
                      oldValue = idMap.put(key, parsable);
                  }
                  if (oldValue != null && oldValue != parsable) {
                      if (oldValue != ComponentIDMap.DUPLICATE) {
                          idMap.put(key, ComponentIDMap.DUPLICATE);
                      }
                      if (tc.isDebugEnabled()) {
                          Tr.debug(tc, "The element {0} has an id {1} that is not unique.", currentElementLocalName, key);
                      }
                  }
                  continue;
              }
              if (XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(attrNS)) {
                  if ("nil".equals(attrLocal)) {
                      parsable.setNil(parseBooleanAttributeValue(i).getBooleanValue());
                      continue;
                  }
                  if ("schemaLocation".equals(attrLocal)) {
                      // no action needed
                      continue;
                  }
              }
              if (parsable.handleAttribute(this, attrNS, attrLocal, i)) {
                  continue;
              }
              throw new ParseException(unexpectedAttribute(attrLocal));
          }
          try {
              while (xsr.hasNext()) {
                  switch (xsr.next()) {
                      case XMLStreamConstants.CHARACTERS:
                      case XMLStreamConstants.CDATA:
                          if (parsable.handleContent(this)) {
                              break;
                          }
                          throw new ParseException(unexpectedContent());
                      case XMLStreamConstants.END_ELEMENT:
                          parsable.finish(this);
                          if (parsable == rootParsable) {
                              // check that the document is well-formed after the end of the root element
                              while (xsr.hasNext()) {
                                  xsr.next();
                              }
                              xsr.close();
                          }
                          return;
                      case XMLStreamConstants.START_ELEMENT:
                          String localName = xsr.getLocalName();
                          if (namespace != null) {
                              if (!namespace.equals(xsr.getNamespaceURI())) {
                                  throw new ParseException(incorrectChildElementNamespace(xsr.getNamespaceURI(), localName));
                              }
                          } else if (xsr.getNamespaceURI() != null) {
                              throw new ParseException(incorrectChildElementNamespace(xsr.getNamespaceURI(), localName));
                          }
                          final boolean handledChild = parsable.handleChild(this, localName);
                          currentElementLocalName = elementLocalName;
                          if (!handledChild) {
                              throw new ParseException(unexpectedChildElement(localName));
                          }
                          break;
                      case XMLStreamConstants.COMMENT:
                      case XMLStreamConstants.PROCESSING_INSTRUCTION:
                          // ignored
                          break;
                      default:
                          int eventType = xsr.getEventType();
                          RuntimeException re = new RuntimeException("unexpected event " + eventType + " while processing element \"" + elementName + "\".");
                          FFDCFilter.processException(re, "com.ibm.ws.javaee.ddmodel.DDParser", "410", this);
                          break;
                  }
              }
          } catch (XMLStreamException e) {
              throw new ParseException(xmlError(e), e);
          }
          throw new ParseException(endElementNotFound());
      }