Arrays 在XML中查找值并从同一父组访问其同级
我有一个包含父节点Arrays 在XML中查找值并从同一父组访问其同级,arrays,xml,powershell,Arrays,Xml,Powershell,我有一个包含父节点hospitalStore的XML文件和一些需要处理的子节点: <?xml version="1.0" encoding="UTF-8"?><!--Hospital Store --> <hospitalStore><!-- Hospital Config --> <src><!--Search Path For Files To Move--> <path>C:\Use
hospitalStore
的XML文件和一些需要处理的子节点:
<?xml version="1.0" encoding="UTF-8"?><!--Hospital Store -->
<hospitalStore><!-- Hospital Config -->
<src><!--Search Path For Files To Move-->
<path>C:\Users\Desktop\move\*.pdf</path>
</src>
<hospital>
<criteria>Beth Israel requirements</criteria>
<name>Beth Israel</name>
<category>OPBEIH</category>
<destination>C:\Users\Desktop\dest\1\</destination>
<hospcode>1101</hospcode>
</hospital><!-- End Hospital Config --><!-- Hospital Config -->
<hospital>
<criteria>Beth Israel CCC - WEST requirements</criteria>
<name>Beth Israel CCC WEST</name>
<category>OPBICC</category>
<destination>C:\Users\Desktop\dest\2\</destination>
<hospcode>1107</hospcode>
</hospital><!-- End Hospital Config --><!-- Hospital Config -->
<hospital>
<criteria>Beth Israel KHD requirements</criteria>
<name>Beth Israel KHD</name>
<category>OPBIKD</category>
<destination>C:\Users\Desktop\dest\3\</destination>
<hospcode>1102</hospcode>
</hospital><!-- End Hospital Config --><!-- Hospital Config -->
<hospital>
<criteria>Beth Israel KHD requirements</criteria>
<name>Beth Israel KHD</name>
<category>OPBIKE</category>
<destination>C:\Users\Desktop\dest\3\</destination>
<hospcode>1102</hospcode>
</hospital><!-- End Hospital Config -->
</hospitalStore><!-- End Hospital Store -->
要查找具有与条件匹配的子节点
类别的医院
:
- PowerShell 4+:
$hospital = $hospitals.Where({ $_.category -eq $foo }, 'first')[0]
- PowerShell 3+:
$hospital = $hospitals | Where category -eq $foo
别名:Where
=Where对象
=?
- PowerShell 1+:
$hospital = $hospitals | Where { $_.category -eq $foo }
别名:Where
=Where对象
=?
- XPath(在Windows的所有PS版本中都可用,但在PowerShell for Linux AFAIK中尚未提供):
PowerShell 1,2,3方法返回一个包含所有匹配节点的数组,或者返回一个匹配值(不是数组),或者不返回任何内容,迭代整个数组。PowerShell 4方法,并在第一次匹配时选择SingleNode stop
所以样板代码可以是这样的:
$xml = New-Object XML
$xml.Load('C:\move\outpatient.xml')
$hospitals = $xml.hospitalStore.hospital
Get-ChildItem $src -File | ForEach {
$file = $_
$fileCategory = $file.BaseName.Substring(0,6)
$fileName = $file.Name
$hospital = $hospitals | Where { $_.category -eq $fileCategory }
if (!$hospital) {
Write-Error "$fileCategory not found in XML"
return # return because we're inside a function-like ScriptBlock
}
# use the values
echo $hospital.criteria
echo $hospital.name
echo $hospital.destination
echo $hospital.hospcode
echo ''
}
$hospital = $xml.SelectSingleNode("//hospital[category='$foo']")
$xml = New-Object XML
$xml.Load('C:\move\outpatient.xml')
$hospitals = $xml.hospitalStore.hospital
Get-ChildItem $src -File | ForEach {
$file = $_
$fileCategory = $file.BaseName.Substring(0,6)
$fileName = $file.Name
$hospital = $hospitals | Where { $_.category -eq $fileCategory }
if (!$hospital) {
Write-Error "$fileCategory not found in XML"
return # return because we're inside a function-like ScriptBlock
}
# use the values
echo $hospital.criteria
echo $hospital.name
echo $hospital.destination
echo $hospital.hospcode
echo ''
}