2015-09-25 3 views
-1

В PowerShell, учитывая следующую неполную структуру XML:Доступ к значениям элементов XML с именами «именем» и «значением»

<ExtraAttributes Enabled="1" PerBuildingEnabled="0" PerBuildingMode="0"> 
    <!--PerBuildingMode 0: Inclusively district and building, Mode 1: Exclusively building--> 
    <Attributes> 
    <A Enabled="1"> 
     <name>mail</name> 
     <value>$UserPrincipalName</value> 
    </A> 
    <A Enabled="1"> 
     <name>ipPhone</name> 
     <value>123456</value> 
    </A> 
    </Attributes> 
</ExtraAttributes> 

Если я пытаюсь получить доступ к значению одного из value элементов со следующее:

# $ExtraAttributes is extracted as [Xml.XmlElement] from an [Xml.XmlDocument] 
foreach ($att in ($ExtraAttributes.Attributes.ChildNodes | where { [int]$_.Enabled -eq $true })) { 
    Write-Host "Name: $($att.name), Value: $($att.value)" 
} 

это прекрасно работает ... однако, если есть только один A элемент под Attributes следующим образом:

<ExtraAttributes Enabled="1" PerBuildingEnabled="0" PerBuildingMode="0"> 
    <!--PerBuildingMode 0: Inclusively district and building, Mode 1: Exclusively building--> 
    <Attributes> 
    <A Enabled="1"> 
     <name>mail</name> 
     <value>$UserPrincipalName</value> 
    </A> 
    </Attributes> 
</ExtraAttributes> 

Powershell считает, что $att.value является $null.

Как получить доступ к этим значениям элементов, когда присутствует только один элемент A с одним и тем же циклом foreach? XML может быть реструктурирован, но я стараюсь избегать этого.

+1

Код, который вы опубликовали, отлично работает с обе частичными структурами, когда я устанавливаю '$ ExtraAttributes' в корневой элемент XML-фрагмента. Следовательно, проблема, скорее всего, связана с тем, как вы выбираете узел '' из фактических данных. –

+0

Я был бы признателен, если бы вы могли отказаться от моего вопроса. Я понял это, хотя я и не обнаружил первопричины. Параметр '$ ExtraAttributes' элемент был снят с корневого документа в следующем формате: ' [XML] $ конфиг = Get-Content myfile.xml' '$ ExtraAttributes = $ config.Configuration.District.ExtraAttributes' Если есть лучший способ сделать это, я хотел бы знать. – Ben

ответ

0

Вместо использования childNodes, я использовал имя A элемента как такового:

foreach ($att in ($ExtraAttributes.Attributes.A | where { [int]$_.Enabled -eq $true })) { 
Write-Host "Name: $($att.name), Value: $($att.value)" 
} 

И это работает, как и ожидалось, есть ли только один или несколько элементов A. Я никогда не понял, почему childNodes не позволяет ему работать.

Смежные вопросы