TXFADataStructure Class

TXFADataStructure 声明于 HPDFXFADataStructure,对既有的原生 XFA 节点树维护设界的结构性编辑,并拥有经该图创建、克隆或移除的一切分离元素树

CreateDataNode 服务于 Data DOM 元素,CreateElement 还支持 TXFAFormStructure 使用的模型元素构造

构造器借用 Root,并在返回之前对照 TXFADataStructureLimits 校验既有树;图必须先于借用根的所有者销毁

所有公开的 AnsiString 名称、命名空间 URI 和文本值都包含 UTF-8 字节

Graph := TXFADataStructure.Create(DatasetsRoot, Limits, OnTick);
try
  Graph.BeginOperation(OnTick);
  try
    Node := Graph.CreateDataNode('dataValue', 'amount');
    Graph.SetValue(Node, '42');
    Graph.Append(RecordNode, Node);
  finally
    Graph.EndOperation;
  end;
finally
  Graph.Free;
end;

操作作用域

BeginOperation(OnTick) 开启一个作用域并拒绝嵌套作用域;EndOperation 释放保存的回调,在清理期间调用是安全的

构造器运行自己的预检作用域并在返回前释放构造器回调;后续方法需要新的活动作用域

OnTick 是 Delphi 匿名过程或 FPC 的 TXFADataStructureTick 类型嵌套过程;它可以抛异常来取消工作,或强制调用方时限、操作计数

各方法在最终取消检查与结构变更之前准备分配、所有权容量和所需的命名空间声明;单个编辑被拒绝时保留既有文档图

一连串成功的直接图调用不会在后续调用失败时自动回滚;脚本运行时提供完整的事件事务,一并恢复其文档、分离图、脚本身份、词法状态和 journal

创建与克隆

CreateDataNode(ClassName, Name, NamespaceURI = '') 接受 dataGroup 或 dataValue,创建全新的分离元素并记录显式的 data node 类元数据

CreateElement(ClassName, Name, NamespaceURI) 创建分离的模型元素,其 XML 本地名为 ClassName,带可选的 XFA name 属性和显式默认命名空间声明

CreateElement 校验 XML 语法、标量值、保留命名空间 URI 和图容量;更高层的 form 工厂校验受支持的 XFA 类 schema

Name 可以是 XML 本地名,也可以是非空前缀对应所给非空命名空间 URI 的限定名;保留的 xml 与 xmlns 绑定会被校验

分离构造步骤允许空名称;附着前请用 Rename 设置合法名称

Clone(Node, Recursive = True) 创建带全新原生身份的分离副本;浅拷贝保留元素自身的值、属性和命名空间声明,排除子节点

继承的命名空间声明在克隆或移动之前实体化,前缀属性在其原祖先作用域之外仍保留原命名空间

所有权编辑

Append(Parent, Node) 把同一节点移到父节点有序子节点的末尾;InsertBefore(Parent, Node, Before) 把它移到某个既有直接子节点之前,Before = nil 等价于追加

Remove(Parent, Node) 分离既有直接子节点并把所有权转给图;对象、后代和原生身份在图销毁或分离快照恢复之前保持有效

外来图、环、移动借用的根、无名附着、非法兄弟引用以及节点/深度/字节溢出都抛出 EHPDFXFAError

值与名称编辑

Rename(Node, Name) 改变元素的本地 XML 名称,同时保留前缀、命名空间 URI、位置、后代和原生身份;已附着元素要求非空的合法 XML 名称

SetValue(Node, Value) 校验 UTF-8 与 XML 标量值,替换普通文本子节点,保留注释和处理指令;空文本移除普通文本子节点

SetAttribute(Node, Name, Value) 在校验限定名语法、UTF-8 值和预计字节预算之后新增或替换属性;空值仍是显式的空属性

SetNamespace(Node, NamespaceURI) 改变元素展开后的命名空间,并更新其当前前缀的声明,同时校验保留绑定

DeclareNamespace(Node, Prefix, NamespaceURI) 新增或替换命名空间声明而不改变元素展开名;元素自身前缀的冲突声明会被拒绝

直接图调用方需要协调前缀属性与其命名空间声明,并把复合编辑放进自己的回滚事务

字节与节点预算包含元素的聚合值及其真实拥有的文本节点,而不是只对文本的一种表示计费

XML 导入预检

ValidateImport(Node, Incoming, Overwrite, OnTick) 在调用方导入拥有的传入 XML 子节点列表之前,检查预计的聚合图

Overwrite 为 true 时,预计尺寸排除目标将被替换的子节点与聚合值;否则既有子节点保留在预算内

该方法不改动传入列表和文档,并且只在当前没有活动作用域时创建临时操作作用域

分离快照

CaptureDetached 返回所有分离根及后代的值快照,包括文本、CDATA、注释、处理指令、属性和命名空间声明

RestoreDetached(Snapshot) 在交换所有权之前校验并准备替换用的分离森林;返回的节点数组按快照顺序排列,为调用方重映射提供全新原生身份

记录字段与身份规则见 TXFADataStructureSnapshot

检视

Root 暴露借用的根,DetachedRoots 暴露图拥有的根供检视;变更请使用图方法,所有权与预算才能保持一致

事务化 Data DOM 脚本 · 事务化 form tree 脚本 · TXFANode