如何为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
相关产品推荐
相关产品推荐

