{"record":{"id":"e06115ff0cf4bd3b","repo":"MuntashirAkon/AppManager","slug":"invalid-tag-inside-set-tagname","errorCode":null,"errorMessage":"Invalid tag inside <set>: ${tagName}","messagePattern":"Invalid tag inside <set>: (.+?)","errorType":"validation","errorClass":"org.xmlpull.v1.XmlPullParserException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/sharedpref/SharedPrefsUtil.java","lineNumber":84,"sourceCode":"                        break;\n                    case TAG_LONG:\n                        if (attrValue != null) {\n                            prefs.put(attrName, Long.valueOf(attrValue));\n                        }\n                        break;\n                    case TAG_STRING:\n                        prefs.put(attrName, parser.nextText());\n                        break;\n                    case TAG_SET:\n                        Set<String> stringSet = new HashSet<>();\n                        prefs.put(attrName, stringSet);\n                        // Grab all strings\n                        event = parser.next();\n                        tagName = parser.getName();\n                        while (event != XmlPullParser.END_TAG || !Objects.equals(tagName, TAG_SET)) {\n                            if (event == XmlPullParser.START_TAG) {\n                                if (!Objects.equals(tagName, TAG_STRING)) {\n                                    throw new XmlPullParserException(\"Invalid tag inside <set>: \" + tagName);\n                                }\n                                stringSet.add(parser.nextText());\n                            }\n                            event = parser.next();\n                            tagName = parser.getName();\n                        }\n                        break;\n                    default:\n                        throw new XmlPullParserException(\"Invalid tag: \" + tagName);\n                }\n            }\n            event = parser.next();\n        }\n        return prefs;\n    }\n\n    public static void writeSharedPref(@NonNull OutputStream os, @NonNull Map<String, Object> hashMap)\n            throws IOException {","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/sharedpref/SharedPrefsUtil.java#L66-L102","documentation":"When reading a persisted StringSet shared preference (a <set> XML block), readSharedPref expects every child start tag inside <set> to be <string>. Any other tag name is a malformed persistence file, so an XmlPullParserException 'Invalid tag inside <set>' is thrown.","triggerScenarios":"Parsing an exported/shared preferences XML whose <set> element contains a non-<string> child (e.g. <null/>, <int/>, or a typo'd tag), typically from hand-editing or a foreign/mismatched prefs file format.","commonSituations":"Importing preferences exported by another app or older version, XML edited manually inserting wrong tags, or corrupted partial writes truncated inside a <set> block.","solutions":["Fix the XML so <set> contains only <string> children","Validate/normalize the prefs file before parsing: reject or sanitize unknown tags inside <set>","Re-export the preferences from the original app rather than hand-editing","Catch XmlPullParserException in import flow and surface a clear 'malformed preferences file' error"],"exampleFix":"// before\nif (!Objects.equals(tagName, TAG_STRING)) {\n    throw new XmlPullParserException(\"Invalid tag inside <set>: \" + tagName);\n}\n// after\nif (!Objects.equals(tagName, TAG_STRING)) {\n    Log.w(TAG, \"Skipping unsupported tag inside <set>: \" + tagName);\n    event = parser.next();\n    continue;\n}","handlingStrategy":"try-catch","validationCode":"// pre-validate prefs XML\nXmlPullParser p = Xml.newPullParser();\np.setInput(reader);\n// walk and assert: inside <set>, every START_TAG name equals \"string\"","typeGuard":null,"tryCatchPattern":"try {\n    value = SharedPrefsUtil.readSharedPref(...);\n} catch (XmlPullParserException e) {\n    Log.w(TAG, \"Malformed prefs file: \" + e.getMessage());\n    value = defaultValue; // skip the bad <set> entry\n} catch (IOException e) {\n    value = defaultValue;\n}","preventionTips":["Never hand-edit exported preferences XML","Validate imported prefs files against the expected schema before parsing","Skip/collect unknown tags instead of failing the whole file when resilience is preferred","Re-export from the source app if corruption is suspected"],"tags":["android","xml","parsing"],"backgroundTag":"schema-validation-failed","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}