From 0c189d203d46cfc2e4e307aa22b76af383a25fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=BE=E5=90=AF=E5=B7=A5=E4=BD=9C=E5=AE=A4?= Date: Sun, 28 Jun 2026 12:14:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Better-EN5=20?= =?UTF-8?q?=E4=BE=A7=20EnbxReader=20=E7=B1=BB=E5=9E=8B=E9=94=99=E8=AF=AF?= =?UTF-8?q?=20+=20PptxImporter=20Relationship=20=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Better-EN5/Services/Conversion/EnbxReader.cs | 11 ++++++----- Better-EN5/Services/Conversion/PptxImporter.cs | 13 ++++++++----- Manager/Services/Conversion/EnbxReader.cs | 5 +++-- Manager/Services/Conversion/PptxImporter.cs | 13 ++++++++----- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Better-EN5/Services/Conversion/EnbxReader.cs b/Better-EN5/Services/Conversion/EnbxReader.cs index 42fd4f6..208170d 100644 --- a/Better-EN5/Services/Conversion/EnbxReader.cs +++ b/Better-EN5/Services/Conversion/EnbxReader.cs @@ -10,6 +10,7 @@ namespace BetterEN5.Services.Conversion { public class EnbxReader { + private static readonly XNamespace Rel = "http://schemas.openxmlformats.org/package/2006/relationships"; private int _nextId; public SmfDocument Import(string enbxPath) @@ -29,7 +30,7 @@ namespace BetterEN5.Services.Conversion if (docPart != null) { var docXml = XDocument.Load(docPart.GetStream()); - ParseDocumentXml(docXml, doc, enbx); + ParseDocumentXml(docXml.Root ?? throw new InvalidOperationException("Missing document root"), doc, enbx); } else { @@ -67,7 +68,7 @@ namespace BetterEN5.Services.Conversion var relsPart = enbx.GetPart(relsUri); var rels = XDocument.Load(relsPart.GetStream()); - foreach (var rel in rels.Root?.Elements("Relationship") ?? Enumerable.Empty()) + foreach (var rel in rels.Root?.Elements(Rel + "Relationship") ?? Enumerable.Empty()) { var type = (string)rel.Attribute("Type") ?? ""; if (type.Contains("document") || type.Contains("officeDocument")) @@ -83,8 +84,8 @@ namespace BetterEN5.Services.Conversion private void ParseDocumentXml(XElement docXml, SmfDocument doc, Package enbx) { - var root = docXml.Root ?? docXml; - var enNs = root.GetDefaultNamespace(); + var root = docXml; + var enNs = root.Name.Namespace; var props = root.Element(enNs + "Properties"); if (props != null) @@ -153,7 +154,7 @@ namespace BetterEN5.Services.Conversion private void ParseSlideXml(XDocument slideXml, SmfDocument doc, int slideNum) { - var root = slideXml.Root ?? slideXml; + var root = slideXml.Root ?? throw new InvalidOperationException("Missing slide root"); var enNs = root.GetDefaultNamespace(); var slide = new SmfSlide { Id = $"slide_{slideNum}" }; diff --git a/Better-EN5/Services/Conversion/PptxImporter.cs b/Better-EN5/Services/Conversion/PptxImporter.cs index d3a336e..c284b30 100644 --- a/Better-EN5/Services/Conversion/PptxImporter.cs +++ b/Better-EN5/Services/Conversion/PptxImporter.cs @@ -12,6 +12,7 @@ namespace BetterEN5.Services.Conversion private static readonly XNamespace A = "http://schemas.openxmlformats.org/drawingml/2006/main"; private static readonly XNamespace P = "http://schemas.openxmlformats.org/presentationml/2006/main"; private static readonly XNamespace R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"; + private static readonly XNamespace Rel = "http://schemas.openxmlformats.org/package/2006/relationships"; private int _nextId; @@ -33,9 +34,11 @@ namespace BetterEN5.Services.Conversion ExtractMediaFiles(pptx, doc); var slideRels = GetSlideRelations(pptx, pres); + var presPartUri = PackUriHelper.CreatePartUri(new Uri("/ppt/presentation.xml", UriKind.Relative)); foreach (var (relId, target, slideNum) in slideRels) { - var slidePart = pptx.GetPart(PackUriHelper.CreatePartUri(new Uri(target, UriKind.Relative))); + var resolvedUri = PackUriHelper.ResolvePartUri(presPartUri, new Uri(target, UriKind.Relative)); + var slidePart = pptx.GetPart(resolvedUri); var slideXml = XDocument.Load(slidePart.GetStream()); var slide = new SmfSlide { Id = $"slide_{slideNum}" }; @@ -100,7 +103,7 @@ namespace BetterEN5.Services.Conversion if (relsPart != null) { var rels = XDocument.Load(relsPart.GetStream()); - var rel = rels.Root?.Elements("Relationship") + var rel = rels.Root?.Elements(Rel + "Relationship") .FirstOrDefault(r => (string)r.Attribute("Id") == embed); if (rel != null) { @@ -228,7 +231,7 @@ namespace BetterEN5.Services.Conversion var relsPart = GetSlideRelsPart(pptx, slide.Id); if (relsPart == null) return; var rels = XDocument.Load(relsPart.GetStream()); - var rel = rels.Root?.Elements("Relationship") + var rel = rels.Root?.Elements(Rel + "Relationship") .FirstOrDefault(r => (string)r.Attribute("Id") == embed); if (rel == null) return; @@ -731,7 +734,7 @@ namespace BetterEN5.Services.Conversion var relsUri = PackUriHelper.CreatePartUri(new Uri("/_rels/.rels", UriKind.Relative)); var relsPart = pptx.GetPart(relsUri); var rels = XDocument.Load(relsPart.GetStream()); - var officeRel = rels.Root?.Elements("Relationship") + var officeRel = rels.Root?.Elements(Rel + "Relationship") .FirstOrDefault(r => (string)r.Attribute("Type") == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); if (officeRel == null) throw new InvalidDataException("未找到 Office Document 关系"); @@ -774,7 +777,7 @@ namespace BetterEN5.Services.Conversion } } - var relDict = rels.Root?.Elements("Relationship") + var relDict = rels.Root?.Elements(Rel + "Relationship") .Where(r => (string)r.Attribute("Type") == slideType) .ToDictionary(r => (string)r.Attribute("Id"), r => (string)r.Attribute("Target")); diff --git a/Manager/Services/Conversion/EnbxReader.cs b/Manager/Services/Conversion/EnbxReader.cs index 10dd9f3..e142804 100644 --- a/Manager/Services/Conversion/EnbxReader.cs +++ b/Manager/Services/Conversion/EnbxReader.cs @@ -10,6 +10,7 @@ namespace BetterSeewo.Manager.Services.Conversion { public class EnbxReader { + private static readonly XNamespace Rel = "http://schemas.openxmlformats.org/package/2006/relationships"; private int _nextId; public SmfDocument Import(string enbxPath) @@ -67,7 +68,7 @@ namespace BetterSeewo.Manager.Services.Conversion var relsPart = enbx.GetPart(relsUri); var rels = XDocument.Load(relsPart.GetStream()); - foreach (var rel in rels.Root?.Elements("Relationship") ?? Enumerable.Empty()) + foreach (var rel in rels.Root?.Elements(Rel + "Relationship") ?? Enumerable.Empty()) { var type = (string)rel.Attribute("Type") ?? ""; if (type.Contains("document") || type.Contains("officeDocument")) @@ -84,7 +85,7 @@ namespace BetterSeewo.Manager.Services.Conversion private void ParseDocumentXml(XElement docXml, SmfDocument doc, Package enbx) { var root = docXml; - var enNs = root.GetDefaultNamespace(); + var enNs = root.Name.Namespace; var props = root.Element(enNs + "Properties"); if (props != null) diff --git a/Manager/Services/Conversion/PptxImporter.cs b/Manager/Services/Conversion/PptxImporter.cs index 33b7068..2053c78 100644 --- a/Manager/Services/Conversion/PptxImporter.cs +++ b/Manager/Services/Conversion/PptxImporter.cs @@ -12,6 +12,7 @@ namespace BetterSeewo.Manager.Services.Conversion private static readonly XNamespace A = "http://schemas.openxmlformats.org/drawingml/2006/main"; private static readonly XNamespace P = "http://schemas.openxmlformats.org/presentationml/2006/main"; private static readonly XNamespace R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"; + private static readonly XNamespace Rel = "http://schemas.openxmlformats.org/package/2006/relationships"; private int _nextId; @@ -33,9 +34,11 @@ namespace BetterSeewo.Manager.Services.Conversion ExtractMediaFiles(pptx, doc); var slideRels = GetSlideRelations(pptx, pres); + var presPartUri = PackUriHelper.CreatePartUri(new Uri("/ppt/presentation.xml", UriKind.Relative)); foreach (var (relId, target, slideNum) in slideRels) { - var slidePart = pptx.GetPart(PackUriHelper.CreatePartUri(new Uri(target, UriKind.Relative))); + var resolvedUri = PackUriHelper.ResolvePartUri(presPartUri, new Uri(target, UriKind.Relative)); + var slidePart = pptx.GetPart(resolvedUri); var slideXml = XDocument.Load(slidePart.GetStream()); var slide = new SmfSlide { Id = $"slide_{slideNum}" }; @@ -100,7 +103,7 @@ namespace BetterSeewo.Manager.Services.Conversion if (relsPart != null) { var rels = XDocument.Load(relsPart.GetStream()); - var rel = rels.Root?.Elements("Relationship") + var rel = rels.Root?.Elements(Rel + "Relationship") .FirstOrDefault(r => (string)r.Attribute("Id") == embed); if (rel != null) { @@ -216,7 +219,7 @@ namespace BetterSeewo.Manager.Services.Conversion var relsPart = GetSlideRelsPart(pptx, slide.Id); if (relsPart == null) return; var rels = XDocument.Load(relsPart.GetStream()); - var rel = rels.Root?.Elements("Relationship") + var rel = rels.Root?.Elements(Rel + "Relationship") .FirstOrDefault(r => (string)r.Attribute("Id") == embed); if (rel == null) return; @@ -565,7 +568,7 @@ namespace BetterSeewo.Manager.Services.Conversion var relsUri = PackUriHelper.CreatePartUri(new Uri("/_rels/.rels", UriKind.Relative)); var relsPart = pptx.GetPart(relsUri); var rels = XDocument.Load(relsPart.GetStream()); - var officeRel = rels.Root?.Elements("Relationship") + var officeRel = rels.Root?.Elements(Rel + "Relationship") .FirstOrDefault(r => (string)r.Attribute("Type") == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); if (officeRel == null) throw new InvalidDataException("未找到 Office Document 关系"); @@ -600,7 +603,7 @@ namespace BetterSeewo.Manager.Services.Conversion foreach (var sldId in sldIdLst.Elements(P + "sldId")) order.Add((string)sldId.Attribute(R + "id")); - var relDict = rels.Root?.Elements("Relationship") + var relDict = rels.Root?.Elements(Rel + "Relationship") .Where(r => (string)r.Attribute("Type") == slideType) .ToDictionary(r => (string)r.Attribute("Id"), r => (string)r.Attribute("Target"));