Доступ / фильтрация XML-узлов без значений - PullRequest
0 голосов
/ 20 ноября 2018

Учитывая следующий XML:

<?xml version="1.0"?>
<doc>
    <taskinformation>
        <taskrecord>
            <taskstatus>
               <complete/>
            </taskstatus>
            <tasknumber>000001</tasknumber>
            <taskduration>13</taskduration>
        </taskrecord>
        <taskrecord>
            <taskstatus>
               <pending/>
            </taskstatus>
            <tasknumber>000002</tasknumber>
        </taskrecord>
    </taskinformation>
</doc>

Я загрузил данные как XML

$Testxml = new-object system.XML.XMLDocument
$Testxmlxml = [xml](Get-Content ".\test.xml")

Как я могу получить доступ ко всем задачам со статусом "в ожидании /" и "выполнено /" отдельно, передайте по конвейеру, укажите количество завершенных и ожидающих задач, возможно, с общим и средним количеством задач для выполненных задач?

Я пытался

$taskinformation.taskrecord | where $_.innerXml -Contains *complete*

Но это не сработало.Буду признателен за любую помощь.


Редактировать: Еще один дополнительный вопрос : почему не работает следующее?

$xml.doc.taskinformation.taskrecord | where-object ($_.taskstatus.innerxml -like "complete")

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вот моя попытка.Это выведет не только подсчитанные результаты, но и сами задачи:

# I faked loading the xml from file using '$xml = [xml](Get-Content ".\test.xml")'
$xml = [xml]@"
<?xml version="1.0"?>
<doc>
    <taskinformation>
        <taskrecord>
            <taskstatus>
               <complete/>
            </taskstatus>
            <tasknumber>000001</tasknumber>
            <taskduration>13</taskduration>
        </taskrecord>
        <taskrecord>
            <taskstatus>
               <complete/>
            </taskstatus>
            <tasknumber>000005</tasknumber>
            <taskduration>124</taskduration>
        </taskrecord>        
        <taskrecord>
            <taskstatus>
               <pending/>
            </taskstatus>
            <tasknumber>000002</tasknumber>
        </taskrecord>
    </taskinformation>
</doc>
"@

$report = "" | Select-Object Pending,Completed,AverageDuration,TotalDuration
$result = @()
$xml.doc.taskinformation.taskrecord | ForEach-Object {
    if ($_.taskstatus.innerXml -like '*complete*') {
        #$countComplete++
        $report.Completed++
        $report.TotalDuration += [double]$_.taskduration
        #$totalDuration += [int]$_.taskduration
        $result += [PSCustomObject]@{
            TaskNumber   = $_.tasknumber
            TaskDuration = $_.taskduration
            TaskStatus   = 'Completed'
        }
    }
    elseif ($_.taskstatus.innerXml -like '*pending*') {
        #$countPending++
        $report.Pending++
        $result += [PSCustomObject]@{
            TaskNumber   = $_.tasknumber
            TaskDuration = ''
            TaskStatus   = 'Pending'
        }
    }
}
# outout the results
$result | Sort-Object TaskNumber | Format-Table -AutoSize
if ($report.Completed) {
    $report.AverageDuration = $report.TotalDuration / $report.Completed
}
$report | Format-Table -AutoSize

Вывод будет:

TaskNumber TaskDuration TaskStatus
---------- ------------ ----------
000001     13           Completed 
000002                  Pending   
000005     124          Completed 



Pending Completed AverageDuration TotalDuration
------- --------- --------------- -------------
      1         2            68,5           137
0 голосов
/ 20 ноября 2018

Вам поможет немного XPath.

$x = [xml]@'
<?xml version="1.0"?>
<doc>
    <taskinformation>
        <taskrecord>
            <taskstatus>
               <complete/>
            </taskstatus>
            <tasknumber>000001</tasknumber>
            <taskduration>13</taskduration>
        </taskrecord>
        <taskrecord>
            <taskstatus>
               <pending/>
            </taskstatus>
            <tasknumber>000002</tasknumber>
        </taskrecord>
        <taskrecord>
            <taskstatus>
               <complete/>
            </taskstatus>
            <tasknumber>000003</tasknumber>
            <taskduration>14</taskduration>
        </taskrecord>
    </taskinformation>
</doc>
'@
($t = $x.SelectNodes('//taskrecord/taskstatus/*[self::complete|self::pending]/../..')) |
  Where-Object { $_.taskstatus.ChildNodes[0].Name -eq 'complete' } |
  ForEach-Object { $_.taskduration } | Measure-Object -Average -Sum |
  Select @{ Name='TotalCount'; Expression={$t.Count} }, Average, Sum |
  Format-Table -AutoSize

TotalCount Average Sum
---------- ------- ---
         3    13,5  27
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...