Problemas ao adicionar dados a um documento XML com PowerShell

1

Tentando adicionar um elemento a um arquivo XML existente usando o PowerShell. Eu olhei vários exemplos e meu script 'add' funciona, mas está extraviando o elemento.

Exemplo de XML que estou usando:

<?xml version="1.0" encoding="UTF-8"?>
<config version="" id="" rev="" marker="">
  <plugins>
    <local>
      <plugin class="LDAPPlugin">
        <config version="0.2">
          <users>
            <search>
              <priority>1</priority>
              <suspended>false</suspended>
              <scope>ALL</scope>
              <orgName>AdmOrg</orgName>
              <filter>LDAPFilter1</filter>
            </search>
          </users> 
        </config>
      </plugin>
    </local>
  </plugins>
</config>

Eu quero adicionar um elemento <search></search> adicional ao arquivo XMl acima. Usando este código, eu fui meio bem-sucedido:

$xmlPath = "C:\productionXML.xml"
$userSearchFilter = "C:\inputData.csv"
$doc = [XML](Get-Content -Path $xmlPath)
foreach($e in (Import-Csv -Path $userSearchFilter))
{
    [STRING]$count = $doc.config.plugins.local.plugin.config.users.search.Count + 1
    $element = $doc.config.plugins.local.plugin.config.users.search[0].clone()
    $element.priority = $count
    $element.suspended = $e.userSuspended
    $element.scope = $e.userScope
    $element.orgName = $e.userOrgMappingAttribute
    $element.filter = $e.userFilter
    $doc.DocumentElement.AppendChild($element)
}
$doc.Save("C:\newProductionXML.xml")

Quando executo o script, o elemento é adicionado, mas, na parte inferior do XML, assim:

<?xml version="1.0" encoding="UTF-8"?>
<config version="" id="" rev="" marker="">
  <plugins>
    <local>
      <plugin class="LDAPPlugin">
        <config version="0.2">
          <users>
            <search>
              <priority>1</priority>
              <suspended>false</suspended>
              <scope>ALL</scope>
              <orgName>AdmOrg</orgName>
              <filter>LDAPFilter1</filter>
            </search>
          </users> 
        </config>
      </plugin>
    </local>
  </plugins>
</config>
<search>
  <priority>1</priority>
  <suspended>false</suspended>
  <scope>ALL</scope>
  <orgName>AdmOrg</orgName>
  <filter>NewLDAPFilter</filter>
</search>

Eu executei esse código em arquivos XML "menos complicados" e ele faz exatamente o que deveria, mas quando o executo no XML, ele coloca o elemento adicional na raiz do XML Arquivo. Por favor, perdoe a minha falta de linguagem exata em relação ao XML, eu não trabalho frequentemente com XML dessa maneira. Qualquer ajuda é muito apreciada.

    
por ptank1972 09.03.2015 / 14:13

1 resposta

0

Existem alguns problemas que você está enfrentando aqui. Primeiro, como há apenas um elemento <search> no início, a propriedade search não será uma coleção. Para corrigir isso, podemos usar GetElementsByTagName para garantir que sempre recebamos uma coleção. Substitua as duas primeiras linhas do loop for por estas:

$searchElements = $doc.config.plugins.local.plugin.config.users.GetElementsByTagName('search')
[STRING]$count = $searchElements.Count + 1
$element = $searchElements[0].Clone()

Segundo e mais relevante para a pergunta em si, AppendChild sobre o DocumentElement ligará o elemento ao documento principal. Você deseja adicioná-lo à tag <users> , por isso chamamos AppendChild na propriedade users . Substitua a última linha do loop for por esta:

$doc.config.plugins.local.plugin.config.users.AppendChild($element) | Out-Null

O Out-Null está lá apenas para impedir que o item recém-adicionado seja ecoado no console.

    
por 28.01.2018 / 21:11