Ako pracovať so spracovaním XML v .NET

Ako pracovať so spracovaním XML v .NET

Súbory XLSX ukladajú svoje údaje v XML častiach vnútri balíka OPC ZIP. Aspose.Cells FOSS pre .NET spracováva tieto pomocou štyroch tried XML mapovačov: WorkbookXmlMapper, WorksheetXmlMapper, SharedStringTableXmlMapper, a StylesheetXmlMapper. Pochopenie týchto tried vám pomôže diagnostikovať zlyhania parsovania a správne nakonfigurovať odolné načítanie. Nainštalujte pomocou dotnet add package Aspose.Cells_FOSS.

Návod krok za krokom

Krok 1: Nainštalovať balík

dotnet add package Aspose.Cells_FOSS

Krok 2: Importovať menný priestor

using Aspose.Cells_FOSS;

Krok 3: Pochopiť zodpovednosti XML mapovača

Každý mapovač spracováva jednu časť XML štruktúry XLSX:

MapovačXML časťSpracováva
WorkbookXmlMapperxl/workbook.xmlMetadáta zošita, zoznam hárkov, definované mená
WorksheetXmlMapperxl/worksheets/sheetN.xmlDáta buniek, vzorce, hyperodkazy, overovania, podmienené formáty
SharedStringTableXmlMapperxl/sharedStrings.xmlOdstránené duplicitné reťazcové hodnoty
StylesheetXmlMapperxl/styles.xmlŠtýly buniek, písma, výplne, okraje

Tieto mapovače sa vyvolávajú automaticky počas konštrukcie Workbook a Save(). Nevytvárate ich priamo v aplikačnom kóde.


Krok 4: Spracovať XmlParsingException

XmlParsingException sa vyhodí, keď mapper narazí na nesprávne formátované XML, ktoré nie je možné opraviť. Povoliť TryRepairXml = true v LoadOptions na aktiváciu cesty parsovania odolnej voči chybám mappera.

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žite LoadDiagnostics na identifikáciu XML problémov

Po úspešnom načítaní skontrolujte LoadDiagnostics.Issues pre DiagnosticEntry záznamy, aby ste pochopili, ktoré opravy XML boli použité a či niektoré viedli k strate dát.

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

Bežné problémy a riešenia

XmlParsingException aj s TryRepairXml = true. XML je tak zle formátovaný, že parser odolný voči chybám ho nedokáže obnoviť. K tomu môže dôjsť so súbormi vytvorenými neštandardnými nástrojmi, ktoré produkujú syntakticky neplatný XML. Pre tieto súbory neexistuje žiadna cesta obnovy.

Štýly chýbajú po načítaní.
StylesheetXmlMapper mohol naraziť na poškodený xl/styles.xml. Skontrolujte LoadDiagnostics.Issues pre položky s kódom súvisiacim so štýlmi a DataLossRisk = true pre ovplyvnené bunky.

Zdieľané reťazce sa zobrazujú ako prázdne bunky. Poškodený xl/sharedStrings.xml môže spôsobiť, že bunky odkazujúce na tabuľku zdieľaných reťazcov sa zobrazia ako prázdne. Povoliť TryRepairXml na pokus o obnovu.

Často kladené otázky

Môžem implementovať vlastný XML mapper?

Nie. Triedy XML mapper sú uzavretá interná infraštruktúra a nie sú určené na rozšírenie.

Prečo je SharedStringTableXmlMapper oddelený?

Špecifikácia OOXML oddeľuje opakujúce sa reťazcové hodnoty do zdieľanej tabuľky reťazcov, aby znížila veľkosť súboru. Mapper spracováva čítanie a zápis tejto tabuľky nezávisle od údajov buniek.

Opravuje TryRepairXml všetky problémy s parsovaním XML?

TryRepairXml spracováva obnoviteľné chyby, ako sú neuzavreté elementy, chýbajúce menné priestory a skrátené hodnoty atribútov. Štrukturálne platné, ale sémanticky nekonzistentné XML (napr. tokeny vzorcov odkazujúce na neexistujúce bunky) sa stále parsuje bez chyby.

Pozri tiež

 Slovenčina