Получите значение одного атрибута XML, используя другой атрибут в качестве ключа в Powershell - PullRequest
0 голосов
/ 07 апреля 2020

Я действительно потерян, делая что-то простое. Мне нужно отсканировать пару тысяч файлов для нескольких определенных c элементов в каждом файле. С файлом xml, приведенным ниже, я пытаюсь получить содержимое атрибута «значение» для определенного имени c «свойства». Так, например, я просто хочу получить значение имени свойства «MY_KEY_DATA1». Я могу выбрать узел на основе приведенного ниже кода, но мне нужно получить значение «314159» для имени свойства «MY_KEY_DATA1». В приведенном ниже коде я могу получить узел и распечатать его, но как читать атрибут атрибута c? Я знаю, что делаю это нелегко, должен быть более простой метод.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mydevice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" dosid="02073" id="" name="MyTargetName">
<manager name="Module 1">
</manager>
<manager name="Module 2">
</manager>
<misc  name="Misc Name">
</misc>
<manager name="Module ABC">
</manager>
<modules>
<module group="Group1" name="name1">
</module>
<module group="Group2" name="name2">
</module>
<module group="Memory" name="myname">
<misc_data name= "MISC_DATA"  value = "42"/>
<property name="MY_KEY_DATA1" value="314159"/>
<property name="USELESS_DATA1" value="2"/>
<property name="MY_KEY_DATA1" value="2718"/>
</module>
</modules>
</mydevice>

-

$Testfile = 'xmltest2.xml'
$xml = [xml](Get-Content $Testfile)


$myNode2 =  $xml.SelectSingleNode("//modules/module[@group='Memory']")
Write-Output $myNode
Foreach ($xmlProperty in $myNode)  {

}

1 Ответ

1 голос
/ 08 апреля 2020

Если у вас есть тип XmlDocument, вы можете выбрать целевой узел и затем напрямую получить доступ к его атрибутам. Вы можете использовать SelectNodes (когда может быть несколько узлов) или SelectSingleNode, когда ожидается один узел. Значение XPATH сузится до указанного узла c, который содержит целевое значение атрибута. Затем вы можете просто получить доступ к значению атрибута, используя оператор доступа к члену ..

$Testfile = 'xmltest2.xml'
$xml = [xml](Get-Content $Testfile)
$xml.SelectNodes("//modules/module[@group='Memory']/property[@name='MY_KEY_DATA1']").value
...