在下面记录的XML文件中,我需要执行以下操作:
- 检查结构"General"、"Exceptions.Weekday name="Aaa"或"Exceptions.Date name=";dd.MM.yyyy是否节点"模式名称=";"天"分别模式名称=";晚上"存在(在节点不存在的情况下不产生错误输出(
- 如果节点存在,则读取每个客户端节点的内容
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
}