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 ''
}