我有这个SVG文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"><g id="icon"><path d="M64.583,8.333c0,-3.449 -2.8,-6.25 -6.25,-6.25l-50,0c-3.449,0 -6.25,2.801 -6.25,6.25l0,50c0,3.45 2.801,6.25 6.25,6.25l50,0c3.45,0 6.25,-2.8 6.25,-6.25l0,-50Z" style="fill:#ebebeb;fill-opacity:0;stroke:#0dcaf2;stroke-width:4.01px;"/><g><circle cx="46.657" cy="16.816" r="8.809" style="fill:#f3ca69;"/><path d="M59.761,54.246l-15.758,-21.165c-0.508,-0.683 -1.548,-0.681 -2.054,0.003l-7.002,9.485l-11.004,-14.732c-0.506,-0.679 -1.525,-0.679 -2.032,-0l-14.753,19.758c-0.163,0.219 -0.253,0.485 -0.253,0.758l0,10.307l52.856,0l0,-4.414Z" style="fill:#4ea17e;fill-rule:nonzero;"/></g></g></svg>
在 Delphi 11.3中,当我用下面的代码加载这个文件并尝试用FormatXMLData
化它时,我得到一个异常:
var ThisXMLDoc := Xml.XMLDoc.TXmlDocument.Create(nil);
try
ThisXMLDoc.LoadFromFile(EditSVGPath.Text);
var FormattedSVGText := Xml.XMLDoc.FormatXMLData(ThisXMLDoc.XML.Text); // ExceptionMessage="Invalid node type", ExceptionName="EXMLDocError"
finally
ThisXMLDoc.Free;
end;
如何修复此错误并正确格式化XML?
更新:在function CloneNodeToDoc
中的Xml.XMLDoc.pas
中发生错误,其中SourceNode.nodeType
被评估:如果SourceNode.nodeType = ntElement or ntAttribute or ntText, ntCData, ntComment or ntEntityRef or ntProcessingInstr or ntDocFragment
则SourceNode.nodeType有效,否则将引发异常。此函数由Xml.XMLDoc.pas中的function FormatXMLData
调用,其中SourceNode参数作为(TXMLNode($A150E48) as IXMLNode)
传递。(顺便说一句,SVG文件由Affinity Designer导出)。
1条答案
按热度按时间cld4siwp1#
为了重现这个问题,我在 Delphi 10.4(Windows 7,64位)中创建了一个新的VCL应用程序,代码如下:
实际上它失败了,但有
EDOMParseError
例外:DTD är förbjudet. 'DTD not allowed.'如果删除DTD,
它按预期工作:
因此,您的问题似乎与您的问题中没有详细说明的情况有关,或者与Delphi10.4中没有的 Delphi 问题有关。(有和没有BOM),但它在UTF-16/32 LE/BE(有和没有BOM)时失败。然而,在这种情况下,错误消息确实明确地抱怨编码。