Получение переменной из XML, ее анализ, а затем формирование запроса SQL - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть один config.xml файл для конфигурации и другой (steps.xml), который действует как руководство и содержит шаги, которые генерируют сценарии для выполнения.

config.xml:

<CFG>
    <Server>sql-server.com</Server>
    <Database>mySQLDB</Database>
</CFG>

steps.xml:

<Steps>
    <Step no="1">
        <script>
          USE [<v>$configs.CFG.Database</v>]
          UPDATE server_name SET name = '<v>$configs.CFG.Server</v>'
        </script>
    </Step>
</Steps>

Я использую <v></v>, чтобы сообщить моему сценарию, где находятся переменные.Я не знаю, является ли это хорошим способом.

Затем я запускаю этот скрипт для анализа файлов:

$configFile = 'd:\ps\config.xml'
$stepsfile = 'd:\ps\steps.xml'
[xml]$steps = Get-Content -Path $stepsfile 
[xml]$configs = Get-Content -Path $configFile

$t = $Steps.Steps.Step[0].script.v

foreach ($var in $t){
    $exec = Invoke-Expression $var
    # use $exec to form a working script
}

Я могу разрешить фактическую информацию из файла конфигурации, ноЯ застрял на том, чтобы собрать его обратно.Я знаю, что могу использовать это, чтобы получить полный текст сценария:

$Steps.Steps.Step[0].script."#text"

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

Вывод, который я пытаюсь достичь, должен быть:

USE [mySQLDB]
UPDATE server_name SET name = 'sql-server.com'

1 Ответ

0 голосов
/ 22 февраля 2019

Invoke-Expression считается вредным .Не используйте его.

Вместо использования вложенных узлов XML в теле скрипта вы можете использовать любой тип заполнителя, который обычно не появляется в коде SQL (например, имена узлов из $configs вфигурные скобки: {Server} и {Database}), а затем вставьте значения с помощью замены строк.

foreach ($step in $steps.SelectNodes('//script')) {
    foreach ($cfg in $configs.SelectNodes('/CFG/*')) {
        $step.'#text' = $step.'#text'.Replace("{$($cfg.Name)}", $cfg.'#text')
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...