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 失敗