protected static Set<FunctionTag> loadTags(final ResourceFile tagDataFile)
			throws SAXException, IOException {

		Set<FunctionTag> tags = new HashSet<>();
		try {
			ErrorHandler errHandler = new ErrorHandler() {
				@Override
				public void error(SAXParseException exception) throws SAXException {
					throw new SAXException("Error: " + exception);
				}

				@Override
				public void fatalError(SAXParseException exception) throws SAXException {
					throw new SAXException("Fatal error: " + exception);
				}

				@Override
				public void warning(SAXParseException exception) throws SAXException {
					throw new SAXException("Warning: " + exception);
				}
			};

			XmlPullParser parser;
			try (InputStream inputStream = tagDataFile.getInputStream()) {
				parser = new NonThreadedXmlPullParserImpl(inputStream, tagDataFile.getName(),
					errHandler, false);
			}

			parser.start("tags");
			while (parser.hasNext()) {
				XmlElement el = parser.next();
				// Parse value of name tag.
				// Only the end XmlElement contains the inner text.
				if (el.isEnd() && "name".equals(el.getName())) {
					String name = el.getText();
					String comment = "";
					// If there's a name value, parse value of comment tag.
					// Add name, comment to list of tags.
					if (name != null && name.trim().length() != 0) {
						if (parser.hasNext() && "comment".equals(parser.peek().getName())) {
							el = parser.next();
							comment = parser.end().getText();
						}
						InMemoryFunctionTag tag = new InMemoryFunctionTag(name, comment);
						tags.add(tag);
					}
				}
			}
			parser.dispose();
		}
		catch (XmlException e) {
			Msg.error(FunctionTagLoader.class, "Error parsing function tags from " + tagDataFile,
				e);
		}

		return tags;
	}
Load function tags from @see ghidra.framework.Application#getModuleDataFile(java.lang.String)

@param moduleDataFilePath data file loaded by Application
@return List list of function tags
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagLoader.java