You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi创建OpenXML的app.xml时子节点自动添加xmlns属性如何解决

问题原因

这是XML命名空间继承逻辑导致的问题。Delphi的XML组件只会自动继承父节点创建时指定的命名空间,你之前是先创建Properties节点,再手动给它追加xmlns属性,此时子节点创建时识别到的父节点默认命名空间为空,序列化时为了标记子节点不属于父节点的默认命名空间,就自动给所有子节点加上了xmlns=""的重置声明。


解决方法

创建节点时主动指定命名空间即可,无需额外配置组件属性,实现代码如下:

const
  // 扩展属性默认命名空间
  EXT_PROPS_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties';
  // VTypes命名空间
  VT_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes';

var
  Root: IXMLNode;
  Rel: IXMLNode;
begin
  // 可选:开启自动缩进,生成的XML格式更整齐
  XMLDocument1.Options := XMLDocument1.Options + [doNodeAutoIndent];
  // 创建根节点时直接指定默认命名空间,不要后续手动加xmlns属性
  Root := XMLDocument1.AddChild('Properties', EXT_PROPS_NS);
  // 声明vt命名空间
  Root.DeclareNamespace('vt', VT_NS);
  
  // 所有子节点创建时都传入根节点的默认命名空间
  Rel := Root.AddChild('Template', EXT_PROPS_NS);
  Rel.Text := 'Normal.dotm';
  
  Rel := Root.AddChild('TotalTime', EXT_PROPS_NS);
  Rel.Text := '1';
  
  Rel := Root.AddChild('Pages', EXT_PROPS_NS);
  Rel.Text := '1';
  
  Rel := Root.AddChild('Words', EXT_PROPS_NS);
  Rel.Text := '1';
  
  // 其他节点按相同规则添加即可
  // ...
end;

生成的XML将完全符合OpenXML格式要求,不会再出现多余的xmlns=""属性。


内容的提问来源于stack exchange,提问作者L Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:18:00