fix: 修复 Better-EN5 侧 EnbxReader 类型错误 + PptxImporter Relationship 命名空间修复

This commit is contained in:
雾启工作室
2026-06-28 12:14:46 +08:00
parent 8c9c62fb74
commit 0c189d203d
4 changed files with 25 additions and 17 deletions

View File

@@ -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<XElement>())
foreach (var rel in rels.Root?.Elements(Rel + "Relationship") ?? Enumerable.Empty<XElement>())
{
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}" };

View File

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