code: private static ArrayList<SimpleEntry<String, String>> traverseNode(Node n, String p) {
          ArrayList<SimpleEntry<String, String>> output = new ArrayList<>();
          String nName;
          if (n.getNodeType() != Node.TEXT_NODE) {
              nName = n.getNodeName();
              if (nName.startsWith("m:")) {
                  nName = nName.substring(2);
              }
              if (nName.equals("mws:qvar")) {
                  return new ArrayList<>();
              }
              p += "/" + nName;
          }
          String nValue = n.getNodeValue();
          if (nValue != null) {
              nValue = nValue.trim();
              if (nValue.length() == 0) {
                  return new ArrayList<>();
              }
          } else {
              nValue = "";
          }
  
          if (!n.hasChildNodes()) {
              output.add(new SimpleEntry<>(p, nValue));
          } else {
              for (int i = 0; i < n.getChildNodes().getLength(); i++) {
                  output.addAll(traverseNode(n.getChildNodes().item(i), p));
              }
          }
          return output;
      }
docs: <xPath,Name,Value>