2011-05-09 23 views
7

Una de las aplicaciones está generando a continuación el archivo XML.Analizando un archivo XML con PowerShell

<root> 
    <command name="Set"> 
     <property name="PWR.WakeupOnLAN" value="6" errorcode="0x0"/> 
    </command> 
    <command name="Set"> 
    </command> 
    <command name="biossettings"> 
     <property name="task" value="Succeeded." errorcode="0x0"/> 
    </command> 
</root> 

estoy interesado en leer el valor y errorcodes de "PWR.WakeupOnLAN" nombre de la propiedad. Antes de publicar aquí, intenté varias cosas pero no pude encontrar el código correcto para leer las propiedades en powershell. ¿Alguien puede ayudarme con el código de powershell para esto?

+0

Por favor, marque la respuesta de corrección. – JasonMArcher

Respuesta

12

En PowerShell 2.0 se puede solucionar esto usando la nueva Select-Xml cmdlet y una expresión XPath:

[xml]$document = "<root><command name='Set'><property name='PWR.WakeupOnLAN' value='6' errorcode='0x0'/></command><command name='Set'></command><command name='biossettings'><property name='task' value='Succeeded.' errorcode='0x0'/></command>" 

$value = (Select-Xml -Xpath "//property[@name='PWR.WakeupOnLAN']/@value" $document).Node.Value 
$errorCode = (Select-Xml -Xpath "//property[@name='PWR.WakeupOnLAN']/@errorcode" $document).Node.Value 

recursos relacionados:

8

@Enrico Campidoglio da la solución "más limpia" que aquí hay una especie de moda de edad.

PS> $xml = [XML](get-content c:\temp\yourfile.xml) 
PS> $errcode = ($xml.root.command | where {$_.property.name -eq "PWR.WakeupOnLAN" }).property.errorcode 
+1

+1 para compatibilidad con versiones anteriores. Su ejemplo funcionará tanto en PowerShell 1.0 como en 2.0. –

2

Otra posibilidad es crear una función. Similar a la solución de JPBlanc.

function Get-Info ($name='PWR.WakeupOnLAN', $targetXml){ 
    $properties = $targetXml.GetElementsByTagName("property") 
    $properties | Where {$_.Name -eq $name} 
} 

Get-Info -targetXml $xml 
Get-Info -name Task -targetXml $xml 
+0

@todos Gracias por las respuestas. Esto realmente me ayudó. –