PowerShell:找到节点并读取其客户端节点



在下面记录的XML文件中,我需要执行以下操作:

  • 检查结构"General"、"Exceptions.Weekday name="Aaa&quot或"Exceptions.Date name=";dd.MM.yyyy是否节点"模式名称=";"天"分别模式名称=";晚上&quot存在(在节点不存在的情况下不产生错误输出(
  • 如果节点存在,则读取每个客户端节点的内容

XML文件包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<P3Dcontrol>
<General>
<Mode name="Day">
<P3DVersion>v4</P3DVersion>
<FlightFile>Maule-LSZH-Schoen.fxml</FlightFile>
<TacPackState>Inactive</TacPackState>
</Mode>
<Mode name="Evening">
<P3DVersion>v4</P3DVersion>
<FlightFile>Maule-LSZH-Schoen.fxml</FlightFile>
<TacPackState>Active</TacPackState>
</Mode>
</General>
<Exceptions>
<Weekday name="Monday">
<Mode name="Evening">
<P3DVersion>v4</P3DVersion>
<FlightFile>Maule-LSZH-Schoen.fxml</FlightFile>
<TacPackState>Inactive</TacPackState>
</Mode>
</Weekday>
<Date name="27.10.2020">
<Mode name="Day">
<P3DVersion>v5</P3DVersion>
<FlightFile>Maule-LSZH-Schoen.fxml</FlightFile>
<TacPackState>Inactive</TacPackState>
</Mode>
</Date>
</Exceptions>
</P3Dcontrol>

我设置代码来读取我知道存在但尚未成功的节点的客户端节点;数组$controlData中的结果都为空:

# Set up working data
$mode        = GetCurrentMode # get current mode ('Day' or 'Evening')
$controlData = @{}    # initialise array for data read
# Set up new XML object and read control file content
$xmlControl = New-Object System.XML.XMLDocument
$xmlControl.Load($controlFileSpec)
# Get <General>.<Mode name=$mode> node content
$xmlControl.P3Dcontrol.General.SelectSingleNode("Mode[@Name = $mode]") | ForEach-Object {
$controlData["P3DVersion"]   = $_.P3DVersion
$controlData["FlightFile"]   = $_.FlightFile
$controlData["TacPackState"] = $_.TacPackState
}

非常感谢您的帮助或提示Hannes

您可以执行以下操作来更新哈希表:

$mode = 'Day'
$controlData = @{} 
$controlFileSpec = 'c:tempx.xml'
$xmlControl = New-Object System.XML.XMLDocument
$xmlControl.Load($controlFileSpec)
$xmlControl.P3Dcontrol.General.SelectSingleNode("Mode[@name = '$mode']") | ForEach-Object {
$controlData["P3DVersion"]   = $_.P3DVersion
$controlData["FlightFile"]   = $_.FlightFile
$controlData["TacPackState"] = $_.TacPackState
}

XPATH表达式中的字符串值需要加引号。由于XPATH表达式包含外部双引号,因此变量将在内部被替换。然后,您可以在表示值的变量周围使用单引号。

XPATH表达式区分大小写。因此CCD_ 1和CCD_。由于XML包含小写的name属性,因此需要在表达式中匹配该属性。

一旦您在$xmlControl中拥有XML文档,您就应该能够使用标准PowerShell构造来处理它。也许是这样的:

$controlData = $xmlControl.P3Dcontrol.General.Mode | Where-Object { $_.Name -eq $mode } | Select-Object P3DVersion,FlightFile,TacPackState

您也可以使用[xml]来解析XML数据,从而保存一两行。


编辑:

上面的行将为您提供一个自定义的Powershell对象,您可以在其中访问$controlData.P3DVersion$controlData.FlightFile等属性。如果您需要一个数组,您可以保留原始代码中的ForEach-Object部分。类似这样的东西:

$xmlControl.P3Dcontrol.General.Mode | Where-Object { $_.Name -eq $mode } | ForEach-Object {
$controlData["P3DVersion"]   = $_.P3DVersion
$controlData["FlightFile"]   = $_.FlightFile
$controlData["TacPackState"] = $_.TacPackState
}

最新更新