Pregunta

¿Cómo puedo obtener una lista de varios archivos XML desde un directorio especificado y para cada archivo de añadir un elemento en el marco del segundo utilizando PowerShell nodo raíz?

Ejemplo: Quiero añadir <LastName>SomeName</LastName> dentro del primer elemento de <Names>:

<People>
  <Names>
      <FirstName>someFirstName</FirstName>
  </Names>
  <Names>
      <FirstName>myFirstName</FirstName>
      <Address>SomeAddress</Address>
  </Names>
</People>

Se convertirá en:

<People>
  <Names>
      <LastName>SomeName</LastName>
      <FirstName>someFirstName</FirstName>
  </Names>
  <Names>
      <FirstName>myFirstName</FirstName>
      <Address>SomeAddress</Address>
  </Names>
</People>
¿Fue útil?

Solución

Puede hacerlo utilizando CreateElement y el método AppendChild

Get-ChildItem c:\temp\ *.xml | 
    % { 
        $xml      = [xml](Get-Content $_.fullname)
        $lastName = $xml.CreateElement('LastName')
        $lastName.PsBase.InnerText = 'SomeName'
        $null     = $xml.People.Names[0].AppendChild($lastName)
        $xml.Save($_.FullName)
    }

En el caso de que ejecute PowerShell V2, que no es necesario que PsBase uso de la propiedad:

        $lastName.InnerText = 'SomeName'

Hay otras maneras a ciencia cierta, pero este es uno es bastante fácil.


En el caso de que el nodo sería más profundo en XML, se puede usar Xpath como esto (tanto encontrar primer nodo Names):

$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top