OpenXML SDK 2.0迁移至3.0:RelationshipErrorHandler替代方案咨询
OpenXML SDK 3.0迁移:替换RelationshipErrorHandlerFactory的实现方法
我正在从OpenXML SDK 2.0迁移至3.0版本,官方更新日志提到:
已移除OpenXmlSettings.RelationshipErrorHandlerFactory及相关类型,替换为内置机制实现该功能
原有代码如下:
OpenSettings openSettings = new OpenSettings() { RelationshipErrorHandlerFactory = RelationshipErrorHandler.CreateRewriterFactory(Rewriter) }; private static string Rewriter(Uri partUri, string id, string uri) => $"http://unknown?id={id}";
改写方案
在SDK 3.0中,你可以通过两种方式实现原代码的链接重写逻辑:
方式1:利用RelationshipChanging事件
在打开文档时订阅OpenXmlPackage的RelationshipChanging事件,在事件处理中直接修改关系的目标地址:
using (var package = WordprocessingDocument.Open("你的文档路径.docx", new OpenSettings())) { package.RelationshipChanging += (sender, args) => { if (args.Relationship.TargetMode == TargetMode.External) { args.Relationship.Target = $"http://unknown?id={args.Relationship.Id}"; } }; // 执行你的文档操作逻辑 }
方式2:加载文档后遍历修正关系
如果需要处理加载时已存在的错误外部关系,可以直接遍历包内的所有关系进行修正:
using (var package = WordprocessingDocument.Open("你的文档路径.docx", new OpenSettings())) { // 以超链接关系为例,可根据实际需求修改关系类型 var hyperlinkRelationships = package.Package.GetRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"); foreach (var rel in hyperlinkRelationships.ToList()) // ToList避免遍历中修改集合报错 { if (rel.TargetMode == TargetMode.External) { package.Package.DeleteRelationship(rel.Id); package.Package.CreateRelationship( new Uri($"http://unknown?id={rel.Id}", UriKind.Absolute), TargetMode.External, rel.RelationshipType, rel.Id); } } // 执行你的文档操作逻辑 }
这两种方式都能实现原代码中对外部链接的重写效果,替代已移除的RelationshipErrorHandlerFactory功能。
内容的提问来源于stack exchange,提问作者argledhel
相关产品推荐
相关产品推荐

