XFA 封包 DOM

TXFAPacketDOM 可載入完整的 XDP 串流或有序的 PDF /XFA 封包陣列,公開 packet 根節點與有界的區域名稱路徑查詢,並支援元素、文字、CDATA、屬性、packet 新增、packet 移除與 packet 重新命名等編輯

無損的未更動 packet

每個載入的串流或 packet 都保留原始位元組與結構指紋;DOM 未被更動時,序列化會原樣回傳那些位元組,而封包陣列的編輯只重寫變更的 packet,並逐位元組保留每個未變更的兄弟節點

規範化的修改輸出

修改過的樹採用 UTF-8 XML、確定性的命名空間與屬性順序、限定元素名稱、XML 實體跳脫、針對內嵌 ]]> 的安全 CDATA 切分、自我閉合的空元素,以及來自來源陣列的 packet 順序

規範化輸出代表的是 DOM 內容而非詞彙層面的細節,因此編輯之後不會重播註解、處理指令、原始縮排、原始 XML 宣告與來源的 DOCTYPE;內部實體值會以文字展開,外部實體則保持未解析

查詢與編輯

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;

開頭的 // 執行有界的後代查詢,以斜線分隔的區段則選取直接子節點;* 符合任何元素,從零開始的 [N] 後綴選取單一符合項

封包陣列發布

SerializePacketArray 回傳有序的 TXFAPacketData record;把每個 record 傳給 THotPDF.AddXFAPacket,或搭配 THotPDF.SetXFADocument 使用 SerializeXDPStream 走單一串流形式

預算

TXFADOMLimits.Default 約束彙總的輸入與輸出位元組、packet 數、節點數、深度、每節點屬性數、彙總屬性與文字位元組,以及 MaxQueryResults;解析、變更驗證、查詢、指紋計算與序列化一旦越界,就會以 EHPDFXFAError 失敗

另見 TXFAPacketDOM、TXFANode 與 TXFADOMLimits