Jak pracovat se zpracováním XML v .NET

Jak pracovat se zpracováním XML v .NET

Soubory XLSX ukládají svá data v XML částech uvnitř balíčku OPC ZIP. Aspose.Cells FOSS pro .NET je zpracovává pomocí čtyř tříd XML mapper: WorkbookXmlMapper, WorksheetXmlMapper, SharedStringTableXmlMapper a StylesheetXmlMapper. Porozumění těmto třídám vám pomůže diagnostikovat selhání parsování a správně nakonfigurovat tolerantní načítání. Nainstalujte pomocí dotnet add package Aspose.Cells_FOSS.

Průvodce krok za krokem

Krok 1: Nainstalujte balíček

dotnet add package Aspose.Cells_FOSS

Krok 2: Importovat jmenný prostor

using Aspose.Cells_FOSS;

Krok 3: Pochopit odpovědnosti XML mapperu

Každý mapper zpracovává jednu XML část struktury XLSX:

MapovačXML částZpracovává
WorkbookXmlMapperxl/workbook.xmlMetadata sešitu, seznam listů, definované názvy
WorksheetXmlMapperxl/worksheets/sheetN.xmlData buněk, vzorce, hypertextové odkazy, validace, podmíněné formátování
SharedStringTableXmlMapperxl/sharedStrings.xmlOdstraněné duplicitní řetězcové hodnoty
StylesheetXmlMapperxl/styles.xmlStyly buněk, písma, výplně, okraje

Tyto mapovače jsou volány automaticky během konstrukce Workbook a Save(). Nevytváříte je přímo v aplikačním kódu.


Krok 4: Ošetřit XmlParsingException

XmlParsingException je vyvolán, když mapper narazí na poškozené XML, které nelze opravit. Povolením TryRepairXml = true v LoadOptions aktivujete cestu tolerantní k chybám při parsování mapperu.

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

Krok 5: Použijte LoadDiagnostics k identifikaci problémů s XML

Po úspěšném načtení zkontrolujte LoadDiagnostics.Issues na DiagnosticEntry záznamy, abyste pochopili, které opravy XML byly aplikovány a zda některé vedly ke ztrátě dat.

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

Běžné problémy a opravy

XmlParsingException i s TryRepairXml = true. XML je tak poškozené, že parser odolný vůči chybám jej nedokáže obnovit. K tomu může dojít u souborů vytvořených nestandardními nástroji, které produkují syntakticky neplatné XML. Pro tyto soubory neexistuje žádná cesta obnovy.

Styly chybí po načtení.
StylesheetXmlMapper mohl narazit na poškozený xl/styles.xml. Zkontrolujte LoadDiagnostics.Issues pro položky s kódem souvisejícím se styly a DataLossRisk = true pro ovlivněné buňky.

Sdílené řetězce se zobrazují jako prázdné buňky.
Poškozený xl/sharedStrings.xml může způsobit, že buňky odkazující na tabulku sdílených řetězců se zobrazí jako prázdné. Povolením TryRepairXml se pokusíte o obnovu.

Často kladené otázky

Mohu implementovat vlastní XML mapper?

Ne. Třídy XML mapper jsou uzavřená interní infrastruktura a nejsou určeny k rozšíření.

Proč je SharedStringTableXmlMapper oddělený?

Specifikace OOXML odděluje opakující se řetězcové hodnoty do sdílené tabulky řetězců, aby snížila velikost souboru. Mapper zpracovává čtení a zápis této tabulky nezávisle na datech buněk.

Opravuje TryRepairXml všechny problémy s analýzou XML?

TryRepairXml zpracovává obnovitelné chyby, jako jsou neuzavřené elementy, chybějící jmenné prostory a zkrácené hodnoty atributů. Strukturně platné, ale sémanticky nekonzistentní XML (např. tokeny vzorců odkazující na neexistující buňky) bude i nadále parsováno bez chyby.

Viz také

 Čeština