Как создать программу на C / C ++, которая генерирует XML и запускает команду DOS впоследствии? - PullRequest
0 голосов
/ 08 декабря 2011

Мне нужно создать программу, которая генерирует 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 ++, если это невозможно в этих языках или если есть другие способычтобы сделать это легко, пожалуйста, не стесняйтесь предлагать.Мое первоначальное предложение на этих языках, потому что это два, с которыми я немного привык.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Я изучаю, как использовать 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 должны иметь возможность выполнять его без установки каких-либо дополнительных компонентов.

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
2 голосов
/ 08 декабря 2011

Что ж, для создания случайного значения вы можете использовать функцию rand () и просто масштабировать ее так, чтобы она находилась между двумя желаемыми значениями.

Чтобы вызвать командную строку, попробуйте system("cachetool.bat -i cacheBody.xml -u REALTIME");

А для xml, если все одинаково, кроме чисел, вы можете просто жестко закодировать его. Если нет, вам понадобится библиотека xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...