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

如何为XML文档的EntityCollection添加实体?Delphi代码调整求助

在Delphi中为SVG的XML文档添加ENTITY声明

我明白你现在的困扰——想给生成的SVG XML文档加上!ENTITY声明,但试了好几次都没成功。先梳理下你的问题细节:

当前代码生成的SVG:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > <svg/>

你期望的目标SVG:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY ns_svg "http://www.w3.org/2000/svg"> <!ENTITY ns_xlink "http://www.w3.org/1999/xlink"> ]> </svg>

其实问题出在你没用到ADOM的IDOMDocumentType接口里的internalSubset属性,这个属性就是专门用来添加DOCTYPE内部子集(比如ENTITY声明)的。调整你的Delphi代码就能解决:

procedure TSVGContainer.SaveToFile(Filename: String);
var
  XMLDoc: IXMLDocument;
  DomImpl: IDOMImplementation;
  DocType : IDOMDocumentType;
begin
  XMLDoc := NewXMLDocument;
  DomImpl := GetDOM(sAdom4XmlVendor);
  XMLDoc.Encoding := 'utf-8';
  
  // 创建基础的DOCTYPE对象
  DocType := DomImpl.createDocumentType('svg', '-//W3C//DTD SVG 1.1//EN', 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd');
  
  // 给DOCTYPE添加内部子集,也就是你需要的两个ENTITY声明
  DocType.internalSubset := '<!ENTITY ns_svg "http://www.w3.org/2000/svg">'#13#10'<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">';
  
  // 基于配置好的DOCTYPE创建DOM文档
  XMLDoc.DOMDocument := DomImpl.createDocument('http://www.w3.org/2000/svg', 'svg', DocType);
  
  XMLDoc.Options := XMLDoc.Options + [doNodeAutoIndent];
  XMLDoc.SaveToFile(Filename);
end;

简单来说,就是在创建DocType对象后,直接通过internalSubset把你需要的ENTITY声明字符串赋值进去,这样生成的DOCTYPE就会包含方括号包裹的内部子集部分,完全符合你的期望。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:02:43