Чтение XML-файла с помощью PowerShell и выбор тегов в зависимости от условий - PullRequest
0 голосов
/ 30 апреля 2019

Я должен проанализировать файл ниже и отобразить несколько тегов в отчете.

<CommChannelQueryResponse>
    <CommChannel>
        <ChannelName>C1</ChannelName>
        <AdapterAttribute>
            <Name>Filename</Name>
            <Value>a.txt</Value>
        </AdapterAttribute>
        <AdapterAttribute>
            <Name>Directory</Name>
            <Value>/dir1</Value>
        </AdapterAttribute>    
        <AdapterAttribute>
            <Name>ArchiveDirectory</Name>
            <Value>/archive1</Value>
        </AdapterAttribute>
        ...
    </CommChannel>
    <CommChannel>
    ...
</CommChannelQueryResponse>

Основываясь на другом сообщении в этом форуме, я попробовал следующее, и это работает.

[xml]$XmlDocument = Get-Content commchannels.xml
$XmlDocument.CommChannelQueryResponse.CommChannel |
    Format-Table -Property @{L="Name"; E={$_.ChannelName}},
        @{L="Filename";Expression={$_.AdapterAttribute.Value[0]}}
Name Filename
---- --------
C1   a.txt
C2   b.txt

Я пытаюсь улучшить это, так как этот код зависит от "Filename", являющегося первым атрибутом. Как я могу изменить это для отображения AdapterAttribute.Value, который имеет AdapterAttribute.Name = "Filename"?

Я попробовал следующее, и, как вы можете видеть, он ничего не отображает для имени файла.

$XmlDocument.CommChannelQueryResponse.CommChannel |
    Format-Table -Property @{L="Name";E={$_.ChannelName}},
        @{L="Filename";Expression={
            $_.AdapterAttribute.Value | Where-Object $_.AdapterAttribute.Name = "Filename"
        }}
Name Filename
---- --------
C1
C2

1 Ответ

0 голосов
/ 30 апреля 2019

Не знаю, хотите ли вы войти в выражения Xpath ... (с учетом регистра)

(select-xml "/CommChannelQueryResponse/CommChannel/AdapterAttribute" file.xml).node

Name             Value
----             -----
Filename         a.txt
Directory        /dir1
ArchiveDirectory /archive1

(select-xml "/CommChannelQueryResponse/CommChannel/AdapterAttribute[Name/text()='Filename']" file.xml).node

Name     Value
----     -----
Filename a.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...