使用 XML 处理
使用 XML 处理
XLSX 文件将其数据存储在 OPC 包内的 XML 部分。Aspose.Cells 用于 .NET 的 FOSS 公开了 XML 解析和序列化层,提供了四个映射器类:WorkbookXmlMapper、WorksheetXmlMapper、SharedStringTableXmlMapper和StylesheetXmlMapper。每个映射器为其对应的 XML 部分实现了 Read 和 Write 操作。这些是内部基础设施 API——大多数应用代码完全通过 Workbook 和 Worksheet 对象工作。
XML 映射器类
每个 XML 映射器负责 XLSX 结构中的一个 XML 部分:
| Mapper | XML 部分 | Responsibility |
|---|---|---|
WorkbookXmlMapper | xl/workbook.xml | 工作簿级元数据,工作表引用,定义的名称 |
WorksheetXmlMapper | xl/worksheets/sheetN.xml | 单元格数据,公式,超链接,条件格式,数据验证 |
SharedStringTableXmlMapper | xl/sharedStrings.xml | 用于去重字符串值的共享字符串表 |
StylesheetXmlMapper | xl/styles.xml | 单元格样式、字体、填充、边框、数字格式 |
每个映射器公开两个方法——Read 和 Write——分别由库的加载和保存管道调用。
XmlParsingException
XmlParsingException 在映射器遇到无法修复的错误 XML 时抛出。当错误特别发生在 XML 解析期间时,它在错误层级中先于 WorkbookLoadException 被抛出。
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)");
}
catch (XmlParsingException ex)
{
Console.WriteLine("XML parse error: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
Console.WriteLine("Load error: " + ex.Message);
}技巧与最佳实践
- 在
LoadOptions中设置TryRepairXml = true以启用映射器的容错解析路径。 - 在处理可能产生错误的 XML 的外部系统文件时,除了捕获
WorkbookLoadException之外,还要捕获XmlParsingException。 - 不应由应用代码实例化 XML 映射器类——它们会在
Workbook构建和Save()期间自动调用。 - 如果需要检查原始 XML 内容以进行诊断,请将 XLSX 提取为 ZIP 并直接检查相关的 XML 部分。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
XmlParsingException 在加载时 | XLSX 的某个部件中出现了格式错误的 XML | 在 LoadOptions 中设置 TryRepairXml = true |
| 往返后缺少样式 | StylesheetXmlMapper 无法解析自定义样式记录 | 检查 LoadDiagnostics.Issues 中的样式相关修复条目 |
| 加载的文件中缺少共享字符串 | SharedStringTableXmlMapper 遇到了损坏的共享字符串表 | 启用 TryRepairXml;请确认原始文件具有有效的 xl/sharedStrings.xml |
FAQ
我可以实现自己的 XML 映射器吗?
XML 映射器类是封闭的内部基础设施。当前的 API 表层不支持自定义映射器。
为什么会有单独的 SharedStringTableXmlMapper?
OOXML 规范将字符串值分离到共享字符串表(xl/sharedStrings.xml)中,以去除工作簿中重复的字符串。映射器独立处理该表的读取和写入。
TryRepairXml = true 能解决所有 XML 问题吗?
TryRepairXml 处理可恢复的问题,例如未闭合的元素、缺失的命名空间和被截断的值。结构上有效但语义上不一致的 XML(例如损坏的公式引用)仍可能导致 XmlParsingException。
API Reference 摘要
| 类 | 描述 |
|---|---|
WorkbookXmlMapper | 读取/写入 xl/workbook.xml |
WorksheetXmlMapper | 每张工作表读取/写入 XML 部分 |
SharedStringTableXmlMapper | 读取/写入 xl/sharedStrings.xml |
StylesheetXmlMapper | 读取/写入 xl/styles.xml |
XmlParsingException | 在不可恢复的 XML 解析失败时抛出 |