Я предлагаю использовать XPath
для этой проблемы:
[xml]$xml = ' ... '
$bookTitle = 'LOTR_TT'
$newStatus = 'Read'
$node = $xml.SelectSingleNode("//BOOK[BOOK_DATA/BOOK_TITLE='$bookTitle']/STATUS")
$node.'#text' = $newStatus
Важной частью здесь является фильтр:
//BOOK[BOOK_DATA/BOOK_TITLE='$bookTitle']/STATUS
Это выберет узел STATUS
из книги, соответствующий фильтру BOOK_TITLE='$bookTitle'
, и PowerShell выставит InnerText
в качестве свойства #text
.
Используется в вашем примере скрипта:
param(
[string]
$BookTitle = 'LOTR_TT',
[string]
$NewStatus = 'Read',
[string]
$FilePath = 'C:\file.xml'
)
[xml]$xml = Get-Content -Path $FilePath
$node = $xml.SelectSingleNode("//BOOK[BOOK_DATA/BOOK_TITLE='$BookTitle']/STATUS")
$node.'#text' = $NewStatus
$xml.Save($FilePath)
В качестве альтернативы, поэтому, если вы хотите найти ВСЕ узлы, содержащие строку, которую нужно изменить для чтения, вы можете сделать следующее:
$xml.SelectNodes("//BOOK[BOOK_DATA/BOOK_TITLE[contains(., '$BookTitle')]]/STATUS") |
ForEach-Object { $_.'#text' = $NewStatus }