XFA 数据包 DOM

TXFAPacketDOM 加载完整的 XDP 流或有序的 PDF /XFA 数据包数组,公开数据包根和有界的本地名称路径查询,并支持元素、文本、CDATA、属性、数据包添加、数据包移除和数据包重命名编辑

无损未触及数据包

每个加载的流或数据包保留其原始字节和结构指纹;当 DOM 未触及时序列化返回那些确切字节,数据包数组编辑只重写更改的数据包,同时逐字节保留每个未更改的兄弟数据包

规范修改输出

修改后的树使用 UTF-8 XML、确定性的命名空间和属性顺序、限定元素名称、XML 实体转义、嵌入式 ]]> 的安全 CDATA 拆分、自闭合空元素以及源数组中的数据包顺序

规范输出表示 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 记录;请把每条记录传给 THotPDF.AddXFAPacket,或使用 SerializeXDPStream 配合 THotPDF.SetXFADocument 处理单流形式

预算

TXFADOMLimits.Default 约束聚合输入和输出字节、数据包数、节点数、深度、每节点属性数、聚合属性和文本字节以及 MaxQueryResults;当越过边界时,解析、变更验证、查询、指纹计算和序列化以 EHPDFXFAError 失败

参见 TXFAPacketDOM、TXFANode 和 TXFADOMLimits