Як працювати з обробкою XML у .NET
Файли XLSX зберігають свої дані у XML‑частинах всередині OPC ZIP‑пакету. 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
Кожен маппер обробляє одну XML‑частину структури XLSX:
| Маппер | XML‑частина | Обробляє |
|---|---|---|
WorkbookXmlMapper | xl/workbook.xml | Метадані робочої книги, список листів, визначені імена |
WorksheetXmlMapper | xl/worksheets/sheetN.xml | Дані клітинок, формули, гіперпосилання, перевірки, умовне форматування |
SharedStringTableXmlMapper | xl/sharedStrings.xml | Дедупліковані рядкові значення |
StylesheetXmlMapper | xl/styles.xml | Стилі клітинок, шрифти, заливки, межі |
Ці мапери викликаються автоматично під час створення Workbook та Save(). Ви не створюєте їх безпосередньо в коді програми.
Крок 4: Обробка XmlParsingException
XmlParsingException генерується, коли мапер стикається з пошкодженим XML, який неможливо виправити. Увімкніть TryRepairXml = true у LoadOptions, щоб активувати шлях парсингу з стійкістю до помилок мапера.
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 mapper?
Ні. Класи XML mapper є запечатаною внутрішньою інфраструктурою і не призначені для розширення.
Чому SharedStringTableXmlMapper окремий?
Специфікація OOXML розділяє повторювані рядкові значення у shared string table, щоб зменшити розмір файлу. mapper обробляє читання та запис цієї таблиці незалежно від cell data.
Чи виправляє TryRepairXml усі проблеми розбору XML?
TryRepairXml обробляє відновлювані помилки, такі як незакриті елементи, відсутні простори імен та скорочені значення атрибутів. Структурно коректний, але семантично несумісний XML (наприклад, токени формули, що посилаються на неіснуючі клітинки) все одно буде розбиратися без помилок.