Считать значения атрибутов XML на основе другого значения атрибута в том же узле с помощью Powershell - PullRequest
0 голосов
/ 16 января 2019

У меня есть XML-файл file1.xml, в котором есть данные, как показано ниже.

<Tag1>
<Tag2>      
  <file Name="file1.rdl" Path="folder34" />
  <File Name="file2.rdl" Path="folder37" />
  <File Name="file3.rdl" Path="folder34" />
  <File Name="File4.rdl" Path="folder76" />
  <File Name="file5.rdl" Path="folder37" />
</Tag2>
</Tag1>

Мне нужен скрипт PowerShell, который будет возвращать значение атрибута Path на основе значения атрибута Name.

Пример:

Если я передам значение «File4.rdl», оно должно вернуть значение как «Folder76».

Я написал команду для чтения данных XML и сохранил данные в массиве $Test.

[xml]$XmlDocument = Get-Content "D:\Roshan\Testing\Test1.xml"

$Test = $XmlDocument.Tag1.Tag2.file | Select-Object Name, Path

Write-Host $Test

Я написал приведенный ниже скрипт PowerShell, чтобы выполнить то же самое.

$AttribureReportName = "File4.rdl"

foreach ($item in $Test) {
    if ($item.Name -eq $AttribureReportName) {
        $FinalFolder = $item.Path
        Write-Output $FinalFolder 
    }
}

Поскольку у меня слишком много тегов XML, выполнение операции заняло много времени. Есть ли лучший способ сделать то же самое?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Во-первых, это неправильно:

[xml]$XmlDocument = Get-Content "D:\Roshan\Testing\Test1.xml"

Не загружайте XML-файлы таким образом, это может вызвать проблемы с кодировкой. У синтаксических анализаторов XML есть продуманный механизм автоматического определения кодировки. Get-Content этого не имеет, поэтому есть большая вероятность, что файл XML загружен с неправильной кодировкой, а данные внутри повреждены.

Используйте синтаксический анализатор XML для загрузки файла.

$XmlDocument = New-Object xml
$XmlDocument.Load("D:\Roshan\Testing\Test1.xml")

После этого вы можете использовать XPath, чтобы выбрать нужный узел из файла. Это будет намного быстрее, чем писать любые циклы Powershell самостоятельно (Where-Object также является циклом).

$File = $XmlDocument.SelectSingleNode("/Tag1/Tag2/File[@Name = 'File4.rdl']")
Write-Host $File.Path
0 голосов
/ 16 января 2019

Поскольку ваш атрибут Name должен сравниваться в нечувствительном к регистру режиме, я предлагаю что-то вроде этого:

[xml]$xml = @"
<Tag1>
<Tag2>      
  <file Name="file1.rdl" Path="folder34" />
  <File Name="file2.rdl" Path="folder37" />
  <File Name="file3.rdl" Path="folder34" />
  <File Name="File4.rdl" Path="folder76" />
  <File Name="file5.rdl" Path="folder37" />
</Tag2>
</Tag1>
"@

$AttribureReportName = "File4.rdl"

foreach ($item in ($xml.Tag1.Tag2.file | Where-Object {$_.Name -eq $AttribureReportName})) {
    $item.Path
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...