阅读每行XML文件

时间:2017-12-15 05:09:01

标签: powershell

我想在PowerShell脚本中读取每行XML文件。在Get-Content XML文件之后,我使用foreach语句来读取每个行元素。它没有工作。如何阅读每行XML文件?

Test.xml

<?xml version="1.0" encoding="utf-8"?>
<Install-Plan>
    <ADSetup> ... </ADSetup>
    <SQLSetup>
        <SqlServerName>ServerName</SqlServerName>
        <SqlVersion>SQL2014</SqlVersion>
        <InstanceName>MSSQLSERVER</InstanceName>
        <SqlInstall>TRUE</SqlInstall>
        <SqlClientInstall>TRUE</SqlClientInstall>
        <RSInstall>TRUE</RSInstall>
        ...
    </SQLSetup>
</Install-Plan>

的PowerShell:

[xml]$XmlData = Get-Content test.xml -ErrorAction Stop
$Config = $xmlData.SelectNodes("//Install-Plan");
$uConfigFile = $Config.CommonConfig.SQLSetup
foreach ($uconfigval in $uConfigFile) {
    switch ($uconfigval[0]) {
        "$SQLServerData.SQLSetup.Sqlserver"  {$uSQL_SERVER_NAME = $uconfigVal.Trim()}
        "$SQLServerData.SQLSetup.SqlVersion" {$uSQLVERSION = $uconfigVal[1].Trim()}
        ...
    }

1 个答案:

答案 0 :(得分:0)

您发布的示例XML没有节点<CommonConfig>,因此$uConfigFile = $Config.CommonConfig.SQLSetup将产生空结果。此外,switch语句的变量和条件完全关闭。

你真正想做的是这样的事情:

foreach ($node in $xmlData.SelectNodes('/Install-Plan/SQLSetup/*')) {
    switch ($node.Name) {
        'SqlServerName' { $uSQL_SERVER_NAME = $node.InnerText.Trim() }
        'SqlVersion'    { $uSQLVERSION = $node.InnerText.Trim() }
        ...
    }
}

或(或许更好)填充哈希表而不是单个变量:

$cfg = @{}
foreach ($node in $xmlData.SelectNodes('/Install-Plan/SQLSetup/*')) {
    $cfg[$node.Name] = $node.InnerText.Trim()
}