XFA Packet DOM

TXFAPacketDOM loads either a complete XDP stream or an ordered PDF /XFA packet array, exposes packet roots and bounded local-name path queries and supports element, text, CDATA, attribute, packet-add, packet-remove and packet-rename edits

Lossless untouched packets

Each loaded stream or packet keeps its original bytes and a structural fingerprint; serialisation returns those exact bytes when the DOM is untouched, and a packet-array edit rewrites only the changed packet whilst byte-preserving every unchanged sibling

Canonical modified output

Modified trees use UTF-8 XML, deterministic namespace and attribute order, qualified element names, XML entity escaping, safe CDATA splitting for embedded ]]>, self-closing empty elements and packet order from the source array

Canonical output represents DOM content rather than lexical trivia, so comments, processing instructions, source indentation, the original XML declaration and a source DOCTYPE are not replayed after an edit; internal entity values are expanded as text and external entities remain unresolved

Queries and edits

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;

A leading // carries out a bounded descendant query, whilst slash-separated segments pick direct children; * matches any element and a zero-based [N] suffix picks one match

Packet-array publication

SerializePacketArray returns ordered TXFAPacketData records; pass each record to THotPDF.AddXFAPacket, or use SerializeXDPStream with THotPDF.SetXFADocument for the single-stream form

Budgets

TXFADOMLimits.Default bounds aggregate input and output bytes, packet count, node count, depth, attributes per node, aggregate attribute and text bytes and MaxQueryResults; parsing, mutation validation, querying, fingerprinting and serialisation fail with EHPDFXFAError when a boundary is crossed

See TXFAPacketDOM, TXFANode and TXFADOMLimits