2010-02-24 3 views
4

Как я могу получить список нескольких XML-файлов из указанного каталога и для каждого файла добавить элемент под вторым корневым узлом с помощью powershell?Использование powershell для редактирования нескольких файлов XML

Пример: Я хочу добавить <LastName>SomeName</LastName> в течение первого <Names> элемента:

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

Станет:

<People> 
    <Names> 
     <LastName>SomeName</LastName> 
     <FirstName>someFirstName</FirstName> 
    </Names> 
    <Names> 
     <FirstName>myFirstName</FirstName> 
     <Address>SomeAddress</Address> 
    </Names> 
</People> 
+0

является Powershell единственный инструмент, который можно использовать? – ghostdog74

+0

Нет, powershell - это не единственный инструмент, который я мог бы использовать. Просто подумал, что это будет проще всего использовать. Вы можете порекомендовать что-нибудь еще? – Draco

ответ

6

Вы можете сделать это с помощью CreateElement и 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) 
    } 

I п так, что вы запускаете PowerShell V2, вам не нужно использовать свойство PsBase:

 $lastName.InnerText = 'SomeName' 

Есть наверняка другие способы, но это один довольно легко.


В случае, когда узел будет глубже в XML, вы можете использовать Xpath, как это (как найти первый Names узел):

$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node 
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node 
+0

Erm, вы должны действительно избавиться от этой строки, в которой упоминаются регулярные выражения в этом ответе. Мы уже спустились по этой дороге, многие из них здесь, на SO-это * не * вариант при обработке XML. – Joey

+0

Готово. Согласитесь с вами, но для некоторых пользователей это может быть вариант. Я мог бы даже заменить первое появление '' '' SomeName ', а затем переформатировать его как xml. * Hack * – stej

+0

Я получаю эту ошибку при запуске скрипта: «Свойство« InnerText »не может быть найдено на этом объекте, убедитесь, что оно существует и настраивается». Могла ли это моя версия Powershell? – Draco

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