我需要想出一个程序来生成这样的 xml 文件:
<?xml version="1.0"?>
<xc:XmlCache xmlns:xc="XmlCache" xc:action="Update">
<xc:XmlCacheArea xc:target="AllSubFields" xc:value="MarketParameters">
<mp:nickName xmlns:mp="mx.MarketParameters" xc:value="MDS">
<mp:date xc:value="TODAY">
<fx:forex xmlns:fx="mx.MarketParameters.Forex">
<fxsp:spot xmlns:fxsp="mx.MarketParameters.Forex.Spot">
<fxsp:pair type="Fields" value="USD/BRL">
<mp:ask xc:type="Field" xc:keyFormat="N">1.890</mp:ask>
<mp:bid xc:type="Field" xc:keyFormat="N">1.800</mp:bid>
</fxsp:pair>
</fxsp:spot>
</fx:forex>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>
节点 mp:ask 和 mp:bid 中的值随机生成,但介于两个预定义值(1.65 和 1.99)之间。
在程序的同一目录中生成xml后,程序应在cmd命令行中运行一条命令,指出:
cachetool.bat -i cacheBody.xml -u REALTIME
其中 cachetool.bat
是已经完成的 bash 脚本,不能更改,也位于程序的同一目录中,而 cacheBody.xml
是之前生成的 xml。
这里的技巧是,这应该重复运行,每次都用新值覆盖 xml 文件,然后再次运行命令,用新值调用 xml。
应该有一种方法可以轻松中断循环,但除此之外,它应该会无限期地运行。
注意:使用c或c++并没有严格的规定,如果在这些语言中不可行或者有其他方法可以轻松做到,请随时提出建议。我最初的建议是使用这些语言,因为我不太习惯处理这两种语言。
最佳答案
我正在学习如何将 javascript 用于 Windows 本地脚本,所以这是 javascript 中的解决方案。
看起来您并不需要动态生成 XML,而是 XML 结构是静态的,只有几个数据字段是动态的。考虑到这一点,我使用模板文件解决了搜索和替换问题。
模板文件 (template.xml) 包含带有一些要搜索和替换的变量的 xml 内容。格式变量格式为 $RANDOM_X_Y$
,其中 X
和 Y
是随机数的下限和上限。为了帮助示例,我在模板文件中生成的卖价和买价略有不同:
<?xml version="1.0"?>
<xc:XmlCache xmlns:xc="XmlCache" xc:action="Update">
<xc:XmlCacheArea xc:target="AllSubFields" xc:value="MarketParameters">
<mp:nickName xmlns:mp="mx.MarketParameters" xc:value="MDS">
<mp:date xc:value="TODAY">
<fx:forex xmlns:fx="mx.MarketParameters.Forex">
<fxsp:spot xmlns:fxsp="mx.MarketParameters.Forex.Spot">
<fxsp:pair type="Fields" value="USD/BRL">
<mp:ask xc:type="Field" xc:keyFormat="N">1.$RANDOM_65_99$0</mp:ask>
<mp:bid xc:type="Field" xc:keyFormat="N">1.$RANDOM_650_990$</mp:bid>
</fxsp:pair>
</fxsp:spot>
</fx:forex>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>
javascript 文件名为 replace.js。所有版本的 Windows 都应该能够在 native 执行它,而无需安装任何额外的组件。
if( WScript.Arguments.Count() != 2 || WScript.Arguments.Item(0) == WScript.Arguments.Item(1) )
{
WScript.Echo("Usage: replace.js <template> <output filename>");
WScript.Quit();
}
var template_filename = WScript.Arguments.Item(0);
var output_filename = WScript.Arguments.Item(1);
var fso = new ActiveXObject("Scripting.FileSystemObject");
var ForReading = 1;
var file, file_contents, lower, upper;
var var_regex = /\$RANDOM_(\d+)_(\d+)\$/g;
if( fso.FileExists(template_filename) )
{
file = fso.OpenTextFile(template_filename, ForReading, false);
file_contents = file.ReadAll().replace(var_regex,
function(str, lower, upper) {
return Math.floor(
Math.random() * (+upper - +lower + 1)) + +lower;
});
file.Close();
file = fso.CreateTextFile(output_filename, true);
file.Write(file_contents);
file.Close();
}
else
{
WScript.Echo("Template does not exist: " + template_filename);
}
现在要无限期地运行您的脚本,只需创建一个名为 run.bat 或其他名称的批处理文件,然后让它循环运行 javascript 和批处理文件。 CTRL-C 将退出脚本。
@echo off
echo Starting. Press CTRL-C to exit.
:loop
replace.js template.xml cacheBody.xml
cachetool.bat -i cacheBody.xml -u REALTIME
goto loop
关于c++ - 如何创建生成 XML 并随后运行 DOS 命令的 C/C++ 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422231/