0

这是一个非常大的 xml 的一部分。我对如何从中获得我需要的结果感到非常困惑。

<Task ID="269930118" Name="Name1" Active="0" NextEID="65" TT="COS" AR="0">
    <For ID="12">
        <If ID="13">
            <When>
                <Criteria>
                    <comp a="[OrigName]" test="MASK" b="53_Inbound_Daily_Account.txt"/>
                </Criteria>
                <UpdOrig Action="d" ID="45"/>
            </When>
        </If>
    </For>
    <If ID="37">
        <When>
            <Criteria>
                <comp a="[TaskStatus]" test="MASK" b="Success"/>
            </Criteria>
            <Email HostID="282198113" Subject="[TaskName] [TaskStatus]" Message="[TaskName] [TaskStatus]" AddressTo="email@email.com" UseDefRetryCount="1" UseDefRetryTimeoutSecs="1" ID="41" Type="SMTP"/>
            <RunTask TaskID="326261818" Wait="0" ID="51"/>
        </When>
    </If>
    <If ID="39">
        <When>
            <Criteria>
                <comp a="[TaskStatus]" test="MASK" b="Failure"/>
            </Criteria>
            <Email HostID="282198113" Subject="[TaskName] [TaskStatus]" Message="[TaskName] [TaskStatus]" AddressTo="email@email.com" UseDefRetryCount="1" UseDefRetryTimeoutSecs="1" ID="40" Type="SMTP"/>
        </When>
    </If>
</Task>

如果以下情况属实,我需要将任务 ID 添加到数组中

comp.a -eq "[TaskStatus]"
comp.b -eq "Failure"
The email node exists right after the comp node. #pseudo code obviously

因此,comp 和 email 需要在同一个 when 节点内,但 when 节点可能是给定任务中深入 xml 的任意数量的节点。我很困惑如何找到这些。想法?

4

1 回答 1

2

尝试这个:

$ids = @()

$xml = [xml](Get-Content .\Desktop\test.xml)

$xml.Task | ForEach-Object {

    if (@($_.SelectNodes('./*/When[Criteria/comp[@a = "[TaskStatus]" and @b = "Failure"] and (Email)]')).Count -gt 0) {
        #Criterias met. Add Task ID
        $ids += $_.ID
    }
}
于 2013-05-13T17:00:37.633 回答