DOM dei Pacchetti XFA
TXFAPacketDOM carica uno stream XDP completo o un packet array /XFA PDF ordinato, espone radici dei pacchetti e query di path per local-name con limiti, e supporta modifiche a elementi, testo, CDATA, attributi, packet-add, packet-remove e packet-rename
Pacchetti intatti lossless
Ogni stream o pacchetto caricato conserva i suoi byte originali e una fingerprint strutturale; la serializzazione restituisce quegli stessi byte esatti quando il DOM è intatto, e una modifica al packet array riscrive solo il pacchetto cambiato, preservando byte per byte ogni sibling invariato
Output canonico delle modifiche
Gli alberi modificati usano XML UTF-8, ordine deterministico di namespace e attributi, nomi di elemento qualificati, escape di entità XML, split sicuro dei CDATA per ]]> incorporato, elementi vuoti self-closing e ordine dei pacchetti dall'array sorgente
L'output canonico rappresenta il contenuto del DOM e non la trivia lessicale, quindi commenti, processing instructions, indentazione della sorgente, dichiarazione XML originale e una DOCTYPE della sorgente non vengono riprodotti dopo una modifica; i valori delle entità interne vengono espansi come testo e le entità esterne restano irrisolte
Query e modifiche
var
DOM: TXFAPacketDOM;
Nodes: TArray<TXFANode>;
XDP: TBytes;
begin
DOM := TXFAPacketDOM.Create;
try
DOM.LoadXDPStream(SourceBytes);
Nodes := DOM.SelectNodes('datasets', '//customer/name');
if Length(Nodes) > 0 then
Nodes[0].SetText('Updated & verified', True);
XDP := DOM.SerializeXDPStream;
PDF.SetXFADocument(XDP);
finally
DOM.Free;
end;
end;
Un // iniziale esegue una query discendente con limiti, mentre i segmenti separati da slash selezionano figli diretti; * corrisponde a qualunque elemento e un suffisso [N] zero-based seleziona una corrispondenza
Pubblicazione del packet array
SerializePacketArray restituisce record TXFAPacketData ordinati; passa ogni record a THotPDF.AddXFAPacket, oppure usa SerializeXDPStream con THotPDF.SetXFADocument per la forma a stream singolo
Budget
TXFADOMLimits.Default limita byte aggregati di input e output, conteggio dei pacchetti, conteggio dei nodi, profondità, attributi per nodo, byte aggregati di attributi e testo e MaxQueryResults; parsing, validazione delle mutazioni, query, fingerprinting e serializzazione falliscono con EHPDFXFAError quando un confine viene superato
Vedi TXFAPacketDOM, TXFANode e TXFADOMLimits