{"record":{"id":"8618bcb55fdd92fb","repo":"dotnet/wpf","slug":"startelement-element-directive","errorCode":null,"errorMessage":"StartElement ::= . ELEMENT DIRECTIVE*.","messagePattern":"StartElement ::= \\. ELEMENT DIRECTIVE\\*\\.","errorType":"exception","errorClass":"XamlUnexpectedParseException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Parser/XamlPullParser.cs","lineNumber":176,"sourceCode":"                _xamlScanner.Read();\n                if (ProvideLineInfo)\n                {\n                    yield return Logic_LineInfo();\n                }\n            }\n\n            yield return Logic_EndOfAttributes();\n            yield return Logic_EndObject();\n        }\n\n        ///////////////////////////\n        //  StartElement ::= ELEMENT DIRECTIVE*\n        //\n        public IEnumerable<XamlNode> P_StartElement()\n        {\n            if (_xamlScanner.NodeType != ScannerNodeType.ELEMENT)\n            {\n                throw new XamlUnexpectedParseException(_xamlScanner, _xamlScanner.NodeType,\n                    StartElementRuleException);\n            }\n\n            yield return Logic_StartObject(_xamlScanner.Type, _xamlScanner.Namespace);\n            _xamlScanner.Read();\n            if (ProvideLineInfo)\n            {\n                yield return Logic_LineInfo();\n            }\n\n            while (_xamlScanner.NodeType == ScannerNodeType.DIRECTIVE)\n            {\n                // Directives are processed exactly like Attributes.\n                foreach (XamlNode node in LogicStream_Attribute())\n                {\n                    yield return node;\n                }\n","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/Parser/XamlPullParser.cs#L158-L194","documentation":"XamlPullParser.P_StartElement implements `StartElement ::= ELEMENT DIRECTIVE*`. It throws XamlUnexpectedParseException when the scanner's NodeType is not ELEMENT, i.e. the parser was asked to produce a start-object node sequence while the current scanner node is not a begin-element token. This guards the grammar contract for open-element tokens (<Tag>) handled by P_Element's second branch.","triggerScenarios":"P_Element's start-element branch entered while the scanner node is not ELEMENT — from a custom scanner emitting wrong node types, or from invoking P_StartElement outside the P_Element flow; also from corrupted scanner state on malformed input.","commonSituations":"Custom reader/scanner implementations failing to classify '<Tag>' as ScannerNodeType.ELEMENT; tests calling P_StartElement directly without positioning the scanner; desynchronized scanner after prior parse errors.","solutions":["Fix the scanner so begin-element tokens set NodeType = ELEMENT (self-closing ones must be EMPTYELEMENT).","Route parsing through P_Element rather than calling P_StartElement directly.","Verify the input is well-formed XML and restart the reader if a previous exception desynchronized state.","If a framework bug is suspected, reproduce minimally and upgrade the WPF/System.Xaml package."],"exampleFix":"// before\nvar nodes = parser.P_StartElement(); // NodeType was not ELEMENT\n\n// after\nvar nodes = parser.P_Element(); // validates EMPTYELEMENT vs ELEMENT itself","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { return XamlReader.Parse(xaml); } catch (XamlUnexpectedParseException ex) { Log($\"Expected ELEMENT node, got {ex.NodeType}\"); return null; }","preventionTips":["Route parsing through P_Element, not P_StartElement directly","Custom scanners must classify '<Tag>' as ELEMENT","Restart the reader after any parse exception to avoid desync"],"tags":["xaml","parser","grammar","internal-invariant"],"backgroundTag":"internal-invariant-violation","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}