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"));