1

Попытка добавить элемент в существующий файл XML с помощью PowerShell. Я рассмотрел несколько примеров, и мой скрипт «add» работает, но он неуместен в элементе.

Образец XML, который я использую:

<?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></search> в вышеупомянутый файл XMl. Используя этот код, я был наполовину успешен:

$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")

Когда я выполняю сценарий, элемент добавляется, но в нижней части XML, например так:

<?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>

Я запустил этот код для "менее сложных" XML-файлов, и тогда он выполняет именно то, что предполагалось, но, когда я запускаю его для нужного мне XML-файла, он помещает дополнительный элемент в корень XML-файла. Пожалуйста, прости меня за отсутствие точного языка в отношении XML, я не часто работаю с XML таким образом. Любая помощь с благодарностью.

1 ответ1

0

Здесь есть пара проблем. Во-первых, поскольку сначала существует только один элемент <search> , свойство search не будет коллекцией. Чтобы это исправить, мы можем использовать GetElementsByTagName чтобы всегда получать коллекцию. Замените первые две строки цикла for следующими:

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

Второе и более относящееся к самому вопросу, AppendChild в DocumentElement прикрепит элемент к основному документу. Вы хотите добавить его в <users> , поэтому мы вызываем AppendChild в свойстве users . Замените последнюю строку цикла for следующим образом:

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

Out-Null как раз для того, чтобы предотвратить добавление вновь добавленного элемента в консоль.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .