如何在 .NET 中进行 XML 处理
XLSX 文件将其数据存储在 OPC ZIP 包内的 XML 部分中。Aspose.Cells FOSS for .NET 通过四个 XML 映射器类处理这些:WorkbookXmlMapper、WorksheetXmlMapper、SharedStringTableXmlMapper和StylesheetXmlMapper。了解这些类有助于诊断解析失败并正确配置容错加载。使用 dotnet add package Aspose.Cells_FOSS 安装。
分步指南
步骤 1:安装软件包
dotnet add package Aspose.Cells_FOSS步骤 2:导入命名空间
using Aspose.Cells_FOSS;第3步:了解 XML Mapper 的职责
每个映射器处理 XLSX 结构中的一个 XML 部分:
| 映射器 | XML 部分 | 处理 |
|---|---|---|
WorkbookXmlMapper | xl/workbook.xml | 工作簿元数据、工作表列表、已定义名称 |
WorksheetXmlMapper | xl/worksheets/sheetN.xml | 单元格数据、公式、超链接、验证、条件格式 |
SharedStringTableXmlMapper | xl/sharedStrings.xml | 去重的字符串值 |
StylesheetXmlMapper | xl/styles.xml | 单元格样式、字体、填充、边框 |
这些映射器在 Workbook 构建和 Save() 期间会自动调用。您不应在应用代码中直接实例化它们。
步骤 4:处理 XmlParsingException
XmlParsingException 在映射器遇到无法修复的错误 XML 时抛出。 在 LoadOptions 中启用 TryRepairXml = true 以激活映射器的容错解析路径。
using Aspose.Cells_FOSS;
var opts = new LoadOptions
{
TryRepairPackage = true,
TryRepairXml = true,
};
try
{
var wb = new Workbook("malformed.xlsx", opts);
Console.WriteLine("Loaded: " + wb.Worksheets.Count + " sheet(s)");
var diag = wb.LoadDiagnostics;
if (diag.HasRepairs)
Console.WriteLine("XML repairs applied. Data loss risk: " + diag.HasDataLossRisk);
}
catch (XmlParsingException ex)
{
Console.WriteLine("Unrecoverable XML error: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
Console.WriteLine("Load failed: " + ex.Message);
}步骤 5:使用 LoadDiagnostics 识别 XML 问题
加载成功后,检查 LoadDiagnostics.Issues 中的 DiagnosticEntry 记录,以了解已应用哪些 XML 修复以及是否有导致数据丢失的情况。
using Aspose.Cells_FOSS;
var opts = new LoadOptions { TryRepairXml = true };
var wb = new Workbook("file.xlsx", opts);
var diag = wb.LoadDiagnostics;
foreach (var entry in diag.Issues)
{
Console.WriteLine($"[{entry.Severity}] {entry.Code}");
Console.WriteLine($" Message: {entry.Message}");
Console.WriteLine($" RepairApplied: {entry.RepairApplied} DataLossRisk: {entry.DataLossRisk}");
}常见问题及解决方案
XmlParsingException 即使有 TryRepairXml = true。
XML 的结构如此畸形,以至于容错解析器无法恢复它。这可能发生在由非标准工具创建的、生成语法无效 XML 的文件中。这类文件没有恢复路径。
加载后样式缺失。StylesheetXmlMapper 可能遇到了损坏的 xl/styles.xml。检查 LoadDiagnostics.Issues 中与样式相关的代码条目,并检查 DataLossRisk = true 中受影响的单元格。
共享字符串显示为空单元格。
损坏的 xl/sharedStrings.xml 可能导致引用共享字符串表的单元格显示为空。启用 TryRepairXml 以尝试恢复。
常见问题
我可以实现自定义 XML 映射器吗?
不。XML mapper 类是封闭的内部基础设施,未设计用于扩展。
为什么 SharedStringTableXmlMapper 是分开的?
OOXML 规范将重复的字符串值分离到共享字符串表中,以减小文件大小。映射器独立于单元格数据处理该表的读取和写入。
是否 TryRepairXml 修复所有 XML 解析问题?
TryRepairXml 处理可恢复的错误,例如未闭合的元素、缺少命名空间以及截断的属性值。结构上有效但语义上不一致的 XML(例如引用不存在单元格的公式标记)仍将解析而不会报错。