c++ - 如何创建生成 XML 并随后运行 DOS 命令的 C/C++ 程序?

标签 c++ c xml batch-file

我需要想出一个程序来生成这样的 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:askmp: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$,其中 XY 是随机数的下限和上限。为了帮助示例,我在模板文件中生成的卖价和买价略有不同:

<?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/

相关文章:

c++ - 是否可以跨 RTLD_LOCAL 加载的库合并 vtables/typeinfo 等弱符号?

c++ - 为什么 −π < atan2(y, x) ≤ π 而对于直线我们真的只需要从 0 到 π?

c - 首先通过套接字发送我要发送的文件的大小

java - FasterXML jackson-dataformat-xml 序列化版本和编码未添加到 xml

c# - 将嵌套 XML 反序列化到类中

c++ - 从 Cascade QML 调用 C++ 函数

c++ - 如何从 qml webgl 获取麦克风到 c++?

c++ - 默认情况下是否应该有任何功能能够就地工作

c - 使用枚举作为参数的奇怪编译行为

xml - 使用带有冒号的 Scala 解析 XML ( :) inside XML tag