我使用以下命令行来整理SVG文件的XML内容:
Winapi.ShellAPI.ShellExecute(Handle, 'open', 'cmd.exe', '/K tidy.exe -q -xml input.svg', nil, SW_SHOWNORMAL);
但是,我将XML内容放在一个字符串变量中。因此,在执行上面的命令行之前,我必须将字符串变量保存到"input.svg“。
如何将字符串变量作为参数直接传递给to,而不是将字符串变量保存到"input.svg“文件中?
发布于 2021-02-08 16:49:21
如果未指定输入文件,则
读取标准输入。如果未指定输出文件,则Tidy将整理后的标记写入标准输出。
如何操作管道是不受Delphi的限制的--它基本上是调用CreateProcess()
,我确信有lots of examples to find。如果你被卡住了,那就问一个关于你的特定问题的新问题。
also comes with a DLL,这可能比一次又一次地启动新进程更好。或者涉及以任何方式都不需要的命令行。
发布于 2021-02-09 21:44:35
使用tidyobj.pas作为libtidy.dll的包装器,我使用了以下代码:
Tidy := TTidy.Create(nil);
try
Tidy.LoadConfigFile('tidy_xml_settings.txt');
s := Tidy.ParseString(Memo1.Lines.Text);
Memo2.Lines.Text := s;
finally
Tidy.Free;
end;
...where tidy_xml_settings.txt定义了这些tidy options
input-xml: yes
output-xml: yes
indent-attributes: yes
它工作得很好,因为它允许根据需要将XML作为字符串传递。
输入XML为:
<svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" enable-background="new 0 0 48 48">
<path fill="#37474F" d="M41,38H7c-2.2,0-4-1.8-4-4V14c0-2.2,1.8-4,4-4h34c2.2,0,4,1.8,4,4v20C45,36.2,43.2,38,41,38z"/>
<path fill="#F3E5F5" d="M6,14v20c0,0.6,0.4,1,1,1h34c0.6,0,1-0.4,1-1V14c0-0.6-0.4-1-1-1H7C6.4,13,6,13.4,6,14z"/>
<polygon fill="#9C27B0" points="26,15 20.1,22 31.9,22"/>
<path fill="#9C27B0" d="M24,21v6c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2h-4v2c0,3.3,2.7,6,6,6s6-2.7,6-6v-6H24z"/>
</svg>
和TIDY创建了这个有效的输出XML:
<svg version="1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 48 48"
enable-background="new 0 0 48 48">
<path fill="#37474F"
d="M41,38H7c-2.2,0-4-1.8-4-4V14c0-2.2,1.8-4,4-4h34c2.2,0,4,1.8,4,4v20C45,36.2,43.2,38,41,38z" />
<path fill="#F3E5F5"
d="M6,14v20c0,0.6,0.4,1,1,1h34c0.6,0,1-0.4,1-1V14c0-0.6-0.4-1-1-1H7C6.4,13,6,13.4,6,14z" />
<polygon fill="#9C27B0"
points="26,15 20.1,22 31.9,22" />
<path fill="#9C27B0"
d="M24,21v6c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2h-4v2c0,3.3,2.7,6,6,6s6-2.7,6-6v-6H24z" />
</svg>
https://stackoverflow.com/questions/66103102
复制