{"record":{"id":"249ef67662ea1c59","repo":"dotnet/wpf","slug":"sr-xpsvalidatingloadermorethanonediscardcontrolinpackage","errorCode":null,"errorMessage":"SR.XpsValidatingLoaderMoreThanOneDiscardControlInPackage","messagePattern":"SR\\.XpsValidatingLoaderMoreThanOneDiscardControlInPackage","errorType":"exception","errorClass":"FileFormatException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedSchema.cs","lineNumber":620,"sourceCode":"                            !_obfuscatedContentType.AreTypeAndSubTypeEqual(new ContentType(targetPart.ContentType)))\n                    {\n                        throw new FileFormatException(SR.XpsValidatingLoaderRestrictedFontHasIncorrectType);\n                    }\n                }\n            }\n\n            // check constraints for XPS fixed payload start part\n            if (_fixedDocumentSequenceContentType.AreTypeAndSubTypeEqual(mimeType))\n            {\n                // This is the XPS payload root part. We also should check if the Package only has at most one discardcontrol...\n                checkRels = package.GetRelationshipsByType(_discardControlRel);\n                count = 0;\n                foreach (PackageRelationship rel in checkRels)\n                {\n                    count++;\n                    if (count > 1)\n                    {\n                        throw new FileFormatException(SR.XpsValidatingLoaderMoreThanOneDiscardControlInPackage);\n                    }\n\n                    // Also check for existence and type\n                    Uri targetUri = PackUriHelper.ResolvePartUri(partUri, rel.TargetUri);\n                    Uri absTargetUri = PackUriHelper.Create(packageUri, targetUri);\n\n                    PackagePart targetPart = package.GetPart(targetUri);\n\n                    if (!_discardControlContentType.AreTypeAndSubTypeEqual(new ContentType(targetPart.ContentType)))\n                    {\n                        throw new FileFormatException(SR.XpsValidatingLoaderDiscardControlHasIncorrectType);\n                    }\n                }\n\n                // This is the XPS payload root part. We also should check if the Package only has at most one thumbnail...\n                checkRels = package.GetRelationshipsByType(_thumbnailRel);\n                count = 0;\n                foreach (PackageRelationship rel in checkRels)","sourceCodeStart":602,"sourceCodeEnd":638,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedSchema.cs#L602-L638","documentation":"The XPS package (payload root, i.e. the FixedDocumentSequence level) may contain at most one DiscardControl part relationship. When ValidateRelationships enumerates package-level discard-control relationships on the start part and finds more than one, it throws FileFormatException.","triggerScenarios":"Opening an XPS package whose package-level relationships include two or more of the discard-control relationship type (http://schemas.microsoft.com/xps/2005/06/discard-control); the loop counter exceeds 1 during validation of the FixedDocumentSequence start part.","commonSituations":"Optimization/preprocessing tools that add a DiscardControl part on each run without removing the previous relationship; merged packages combining discard-control rels from multiple sources; scripts editing package-level relationships directly.","solutions":["Remove all but one package-level discard-control relationship (rebuild the DiscardControl part listing and re-create a single relationship).","Merge discard information into a single DiscardControl part instead of multiple parts.","Rebuild the package with a single discard-control relationship via a compliant XPS writer.","Audit package-level GetRelationshipsByType(discardControlRel) count before loading."],"exampleFix":"// before\npkg.CreateRelationship(discardUri1, TargetMode.Internal, discardRel);\npkg.CreateRelationship(discardUri2, TargetMode.Internal, discardRel); // second rel\n// after\nif (!pkg.GetRelationshipsByType(discardRel).Any())\n    pkg.CreateRelationship(discardUri, TargetMode.Internal, discardRel);","handlingStrategy":"validation","validationCode":"var discardRels = package.GetRelationshipsByType(discardControlRel).ToList();\nif (discardRels.Count > 1)\n    discardRels.Skip(1).ToList().ForEach(r => package.DeleteRelationship(r.Id));","typeGuard":"static bool HasAtMostOneDiscardControl(Package package, string relType) =>\n    !package.GetRelationshipsByType(relType).Cast<PackageRelationship>().Skip(1).Any();","tryCatchPattern":"try { loader.Load(packageStream); }\ncatch (FileFormatException ex) { // multiple discard-control rels: rebuild single rel and retry\n    RebuildSingleDiscardControlRel(packageStream); loader.Load(packageStream); }","preventionTips":["Reuse/update one DiscardControl part and relationship instead of adding new ones per optimization pass.","When merging packages, consolidate discard-control information into a single part.","Verify package-level relationship counts before finalizing XPS output."],"tags":["xps","discard-control","package-relationships","validation"],"backgroundTag":"schema-validation-failed","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"}