Winapi 如何将字符串变量而不是文件名参数传递给TIDY?

Winapi 如何将字符串变量而不是文件名参数传递给TIDY?,winapi,cmd,Winapi,Cmd,我使用此命令行整理SVG文件的XML内容: Winapi.ShellAPI.ShellExecute(Handle, 'open', 'cmd.exe', '/K tidy.exe -q -xml input.svg', nil, SW_SHOWNORMAL); 但是,我将XML内容放在一个字符串变量中。因此,在执行上述命令行之前,我必须将字符串变量保存到“input.svg” 如何将字符串变量直接作为TIDY的参数传递,而不必将字符串变量保存到“input.svg”文件中?手册: 如果未指定

我使用此命令行整理SVG文件的XML内容:

Winapi.ShellAPI.ShellExecute(Handle, 'open', 'cmd.exe', '/K tidy.exe -q -xml input.svg', nil, SW_SHOWNORMAL);
但是,我将XML内容放在一个字符串变量中。因此,在执行上述命令行之前,我必须将字符串变量保存到“input.svg”

如何将字符串变量直接作为TIDY的参数传递,而不必将字符串变量保存到“input.svg”文件中?

手册:

如果未指定输入文件,Tidy将读取标准输入。如果未指定输出文件,Tidy会将整理后的标记写入标准输出

如何使用管道与Delphi无关——它基本上是在调用
CreateProcess()
,我确信确实存在。如果你陷入困境,那么就针对你的特定问题提出一个新问题

这可能比一次又一次地启动新流程更好。或涉及任何不需要的命令行。

手册:

如果未指定输入文件,Tidy将读取标准输入。如果未指定输出文件,Tidy会将整理后的标记写入标准输出

如何使用管道与Delphi无关——它基本上是在调用
CreateProcess()
,我确信确实存在。如果你陷入困境,那么就针对你的特定问题提出一个新问题

这可能比一次又一次地启动新流程更好。或者包含任何方式都不需要的命令行。

作为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;
…其中tidy_xml_settings.txt定义了以下内容:

它工作得很好,因为它允许根据需要将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>

并创建了以下有效的输出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>

作为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;
…其中tidy_xml_settings.txt定义了以下内容:

它工作得很好,因为它允许根据需要将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>

并创建了以下有效的输出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输入,则可以运行tidy.exe,将其标准输入重定向到写入XML的管道。比使用文件简单得多。这个问题与Delphi完全无关。这只是关于tidy.exe接受的命令行参数。@DelphiCoder当你看到fpiette的评论时,你就会意识到这个问题与Delphi有关。@fpiette你能提供一个Delphi示例,说明如何将tidy的标准输入重定向到管道吗?@user1580348我不这么认为,这几乎是任何编程语言都可以做到的!如果tidy支持标准输入的XML输入,则可以在将其标准输入重定向到写入XML的管道后运行tidy.exe。比使用文件简单得多。这个问题与Delphi完全无关。这只是关于tidy.exe接受的命令行参数。@DelphiCoder当你看到fpiette的评论时,你就会意识到这个问题与Delphi有关。@fpiette你能提供一个Delphi示例,说明如何将tidy的标准输入重定向到管道吗?@user1580348我不这么认为,这几乎是任何编程语言都可以做到的!谢谢你提到这个整洁的DLL。在我的问题中,命令行的等效DLL函数是什么?根据\include\tidy.h,
tidyOptSet*()
tidyParse*()
tidySave*()
函数看起来很有希望。感谢您提到tidy DLL。在我的问题中,命令行的等效DLL函数是什么?根据\include\tidy.h,
tidyOptSet*()
tidyParse*()
tidySave*()
函数看起来很有希望。