private void parseNote(XmlPullParser parser, ArrayList<SnapticNote> returnVal)
      throws XmlPullParserException, IOException {
    // Create a blank note object
    SnapticNote note = new SnapticNote();
    returnVal.add(note);
    int eventType = parser.next();

    while (eventType != XmlPullParser.END_DOCUMENT) {
      if (eventType == XmlPullParser.START_TAG) {
        String startTag = parser.getName();

        // one-liners:
        if (XML_TAG_ID.equals(startTag)) {
          long nodeId = Long.parseLong(parser.nextText());
          note.id = nodeId;
          parse_trace("Note ID is " + note.id);
        } else if (XML_TAG_PARENT_ID.equals(startTag)) {
          long parentId = Long.parseLong(parser.nextText());
          note.parentId = parentId;
          parse_trace("Parent ID is " + note.parentId);
        } else if (XML_TAG_SOURCE.equals(startTag)) {
          String source = parser.nextText();
          note.source = source;
          parse_trace("Note source is " + note.source);
        } else if (XML_TAG_SOURCE_URL.equals(startTag)) {
          String sourceUrl = parser.nextText();
          note.sourceUrl = sourceUrl;
          parse_trace("Note source URL is " + note.sourceUrl);
        } else if (XML_TAG_CREATED.equals(startTag)) {
          String creationTime = parser.nextText();
          note.creationTime = parse3339(creationTime);
          parse_trace("Creation time is " + creationTime + " (" + note.creationTime + ')');
        } else if (XML_TAG_MODIFIED.equals(startTag)) {
          String modificationTime = parser.nextText();
          note.modificationTime = parse3339(modificationTime);
          parse_trace(
              "Modification time is " + modificationTime + " (" + note.modificationTime + ')');
        } else if (XML_TAG_REMINDER.equals(startTag)) {
          String reminderTime = parser.nextText();
          note.reminderTime = parse3339(reminderTime);
          parse_trace("Reminder time is " + reminderTime + " (" + note.reminderTime + ')');
        } else if (XML_TAG_TEXT.equals(startTag)) {
          String text = parser.nextText();
          note.text = text;
          parse_trace("Note text is \"" + note.text + '"');
        } else if (XML_TAG_SUMMARY.equals(startTag)) {
          String summary = parser.nextText();
          note.summary = summary;
          parse_trace("Note summary is \"" + note.summary + '"');
        } else if (XML_TAG_CHILDREN.equals(startTag)) {
          long childCount = Long.parseLong(parser.nextText());
          note.children = childCount;
          parse_trace("Child count is " + note.children);
        } else if (XML_TAG_MODE.equals(startTag)) {
          String mode = parser.nextText();
          note.mode = mode;
          parse_trace("Mode is " + note.mode);
        } else if (XML_TAG_PUBLIC_URL.equals(startTag)) {
          String publicUrl = parser.nextText();
          note.publicUrl = publicUrl;
          parse_trace("Public URL is " + note.publicUrl);
        }
        // new blocks:
        else if (XML_TAG_USER.equals(startTag)) {
          parse_trace("Parsing note owner data.");
          parseNoteOwner(parser, note);
        } else if (XML_TAG_TAGS.equals(startTag)) {
          parse_trace("Parsing note tags.");
          parseTags(parser, note);
        } else if (XML_TAG_LOCATION.equals(startTag)) {
          parse_trace("Parsing geotag.");
          parseLocation(parser, note);
        } else if (XML_TAG_MEDIA.equals(startTag)) {
          parse_trace("Parsing media list.");
          parseMedia(parser, note);
        } else {
          parse_trace("(parseNote) unknown XML tag: <" + startTag + ">");
        }
      } else if (eventType == XmlPullParser.END_TAG) {
        String endTag = parser.getName();

        if (XML_TAG_NOTE.equals(endTag)) {
          parse_trace("Parsing note complete.");
          break;
        }
      }

      eventType = parser.next();
    }
  }