@Override
  public void startElement(
      final String namespaceURI,
      final String localName,
      final String qName,
      final Attributes attrs) {
    if ("testsuite".equals(qName)) {
      final TestSuite node = new TestSuite();
      node.setName(attrs.getValue("name"));

      final TestSuite parentNode = getParentTestSuite();
      if (parentNode != null) {
        parentNode.addTestNode(node);
        node.setParent(parentNode);
      }

      if (rootNode == null) {
        rootNode = node;
      }

      queue.add(node);
    } else if ("testcase".equals(qName)) {
      final TestCase node = new TestCase();
      node.setName(attrs.getValue("name"));
      node.setInternalId(Integer.parseInt(attrs.getValue("internalid")));

      final TestSuite parentNode = getParentTestSuite();
      if (parentNode != null) {
        parentNode.addTestNode(node);
        node.setParent(parentNode);
      }

      queue.add(node);
    } else if ("step".equals(qName)) {
      final TestStep node = new TestStep();

      final TestCase parentNode = getParentTestCase();
      if (parentNode != null) {
        parentNode.addTestStep(node);
        node.setParent(parentNode);
      }

      queue.add(node);
    } else if ("keyword".equals(qName)) {
      final TestNode testNode = getCurrentTestNode();
      if (testNode != null) {
        final String name = attrs.getValue("name");
        if (StringUtil.isNotBlank(name)) {
          testNode.addKeyword(name);
        }
      }

      queue.add(EMPTY_OBJ);
    } else if ("node_order".equals(qName) //
        || "details".equals(qName) //
        || "externalid".equals(qName) //
        || "version".equals(qName) //
        || "summary".equals(qName) //
        || "preconditions".equals(qName) //
        || "execution_type".equals(qName) //
        || "importance".equals(qName) //
        || "step_number".equals(qName) //
        || "actions".equals(qName) //
        || "expectedresults".equals(qName) //
        || "execution_type".equals(qName) //
    ) {
      queue.add(new StringBuilder(100));
    } else {
      queue.add(EMPTY_OBJ);
    }
    // TODO notes
  }
 @Override
 public void endElement(final String namespaceURI, final String localName, final String qName) {
   if ("testsuite".equals(qName)) {
     // nothing
   } else if ("testcase".equals(qName)) {
     // nothing
   } else if ("step".equals(qName)) {
     // nothing
   } else if ("node_order".equals(qName)) {
     final TestNode node = getParentTestNode();
     if (node != null) {
       node.setNodeOrder(getTextValueAsInt());
     }
   } else if ("details".equals(qName)) {
     final TestSuite node = getParentTestSuite();
     if (node != null) {
       node.setDetails(getTextValue());
     }
   } else if ("externalid".equals(qName)) {
     final TestCase node = getParentTestCase();
     if (node != null) {
       node.setExternalId(getTextValueAsInt());
     }
   } else if ("version".equals(qName)) {
     final TestCase node = getParentTestCase();
     if (node != null) {
       node.setVersion(getTextValueAsInt());
     }
   } else if ("summary".equals(qName)) {
     final TestCase node = getParentTestCase();
     if (node != null) {
       node.setSummary(getTextValue());
     }
   } else if ("preconditions".equals(qName)) {
     final TestCase node = getParentTestCase();
     if (node != null) {
       node.setPreconditions(getTextValue());
     }
   } else if ("execution_type".equals(qName)) {
     final TestCase node = getParentTestCase();
     if (node != null) {
       node.setExecutionType(getTextValueAsInt());
     }
   } else if ("importance".equals(qName)) {
     final TestCase node = getParentTestCase();
     if (node != null) {
       node.setImportance(getTextValueAsInt());
     }
   } else if ("step_number".equals(qName)) {
     final TestStep node = getParentTestStep();
     if (node != null) {
       node.setStepNumber(getTextValueAsInt());
     }
   } else if ("actions".equals(qName)) {
     final TestStep node = getParentTestStep();
     if (node != null) {
       node.setActions(getTextValue());
     }
   } else if ("expectedresults".equals(qName)) {
     final TestStep node = getParentTestStep();
     if (node != null) {
       node.setExpectedResults(getTextValue());
     }
   } else if ("execution_type".equals(qName)) {
     final TestStep node = getParentTestStep();
     if (node != null) {
       node.setExecutionType(getTextValueAsInt());
     }
   }
   queue.removeLast();
 }