public static FileBitPatternInfo fromXml(Element e) throws IOException {

		String ghidraURL = e.getAttributeValue("ghidraURL");
		String languageID = e.getAttributeValue("languageID");
		int numFirstBytes =
			XmlUtilities.parseInt(XmlUtilities.requireStringAttr(e, "numFirstBytes"));
		int numFirstInstructions =
			XmlUtilities.parseInt(XmlUtilities.requireStringAttr(e, "numFirstInstructions"));
		int numPreBytes = XmlUtilities.parseInt(XmlUtilities.requireStringAttr(e, "numPreBytes"));
		int numPreInstructions =
			XmlUtilities.parseInt(XmlUtilities.requireStringAttr(e, "numPreInstructions"));
		int numReturnBytes =
			XmlUtilities.parseInt(XmlUtilities.requireStringAttr(e, "numReturnBytes"));
		int numReturnInstructions =
			XmlUtilities.parseInt(XmlUtilities.requireStringAttr(e, "numReturnInstructions"));

		List<FunctionBitPatternInfo> funcBitPatternInfoList = new ArrayList<>();
		Element funcBitPatternInfoListEle = e.getChild("funcBitPatternInfoList");
		if (funcBitPatternInfoListEle != null) {
			for (Element childElement : XmlUtilities.getChildren(funcBitPatternInfoListEle,
				FunctionBitPatternInfo.XML_ELEMENT_NAME)) {
				funcBitPatternInfoList.add(FunctionBitPatternInfo.fromXml(childElement));
			}
		}

		FileBitPatternInfo result = new FileBitPatternInfo();
		result.setFuncBitPatternInfo(funcBitPatternInfoList);
		result.setGhidraURL(ghidraURL);
		result.setLanguageID(languageID);
		result.setNumFirstBytes(numFirstBytes);
		result.setNumFirstInstructions(numFirstInstructions);
		result.setNumPreBytes(numPreBytes);
		result.setNumPreInstructions(numPreInstructions);
		result.setNumReturnBytes(numReturnBytes);
		result.setNumReturnInstructions(numReturnInstructions);

		return result;
	}
Creates a {@link FileBitPatternInfo} instance from XML.

@param e XML element to convert
@return new {@link FileBitPatternInfo}, never null
@throws IOException if file IO error or xml data problem
Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/info/FileBitPatternInfo.java