Поскольку вы предоставляете пример с пространством имен, у вас будет немного другой способ определения ваших путей.
Ваше XML помечает пространство имен на объектах, поэтому все объекты под объектами считаются частью указанного c пространства имен. Это пространство имен необходимо при поиске, редактировании или удалении узлов.
$xml.SelectSingleNode("/configuration/services/x:objects/x:object/x:app-args/x:list/x:value[1]", $Namespace)
$Namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $xml.NameTable
$Namespace.AddNamespace("x", "http://www.springframework.net")
Поскольку /configuration/services
находятся за пределами этого пространства имен, вам не нужно отмечать их этим namespaceManager
. Но все, включая objects
, включая теги *1008*, должны быть помечены.
Если вы заинтересованы в изменении значений, вам необходимо обновить InnerText
элементов.
$xml.DocumentElement.SelectSingleNode("/configuration/services/x:objects/x:object/x:app-args/x:list/x:value[1]", $Namespace).InnerText = "New Value for First"
# or you can use // to search for the first element
$xml.DocumentElement.SelectSingleNode("//x:objects/x:object/x:app-args/x:list/x:value[1]", $Namespace).InnerText = "New Value for First"
Также обратите внимание, что значение индексируется, начиная с 1. Нет value[0]
. Исходя из всего этого, ваш CSV необходимо обновить, чтобы включить теги пространства имен.
"//x:objects/x:object/x:app-args/x:list/x:value[1]","new value 1"
"//x:objects/x:object/x:app-args/x:list/x:value[2]","new value 2"
Полный код
$Namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $xml.NameTable
$Namespace.AddNamespace("x", "http://www.springframework.net")
$csv = Get-Content C:\temp\csv.txt
[xml]$xml = Get-Content C:\temp\xml.txt
foreach($line in $csv) {
$items = $line.Replace("""", "").Split(",") # Remove extra quotes
$xml.DocumentElement.SelectSingleNode($items[0], $Namespace).InnerText = $Items[1]
}
$xml.Save("C:\temp\new.txt")
new.txt содержание:
<configuration>
<services>
<objects xmlns="http://www.springframework.net" default-lazy-init="true">
<object name="SystemConfiguration" type="SystemConfiguration">
<app-args name="Codes">
<list element-type="string">
<value>new value 1</value>
<value>new value 2</value>
</list>
</app-args>
</object>
</objects>
</services>
</configuration>
--------------------------------- -----------------------
Предлагаемое решение с обновленным вопросом
На основе на вашем новом xml я бы порекомендовал пойти по маршруту Select-XML
.
CSV
"//ns:objects/ns:object/ns:app-args/ns:list/ns:value[1]","new value 1"
"//ns:objects/ns:object/ns:app-args/ns:list/ns:value[2]","new value 2"
CODE
$csv = Get-Content C:\temp\csv.txt
[xml]$xml = Get-Content C:\temp\xml.txt
$ns = @{ns='http://www.springframework.net'}
foreach($line in $csv)
{
$items = $line.Replace("""", "").Split(",") # Remove extra quotes
$nodeRef = Select-Xml -Xml $xml -XPath $items[0] -Namespace $ns
$nodeRef.Node.InnerText = $items[1]
}
$xml.Save("C:\temp\new.txt")
Новый файл имеет обновленные значения.
Пожалуйста, отметьте ответ, если он отвечает на вопрос в вашем сообщении.