Различать имя тега и атрибут "имя" XML PowerShell

У меня есть вход XML, как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
 <Content>
    <section name="FileID"/>
    <FileID>109F2AEA-6D9C-4127-963A-9C71D4155C5D</FileID>
       <File Path="C:\test.config">
          <Tag TagName="configuration"/>
       </File>
 </Content>

Когда я делаю рекурсивный поиск каждого узла, чтобы идентифицировать узел с именем "FileID", используя следующую строку кода в PowerShell:

if($ConfigChildItem.Name -eq "FileID")
{
    ...
}

где $ConfigChildItem заполняется рекурсивными узлами из XML для поиска. Таким образом я ожидал получить узлы с именем "FileID", например:

<FileID>109F2AEA-6D9C-4127-963A-9C71D4155C5D</FileID>

Но это такие теги:

<section name="FileID"/>

поскольку они имеют атрибут "имя" со значением "FileID". Как получить только теги с именем "FileID", а не те, которые имеют имя атрибута как "имя" и значение этих атрибутов как "FileID"?

1 ответ

Решение

Один из многих способов сделать это (используя xpath):

$xml = [XML] @'
<?xml version="1.0" encoding="utf-8"?>
 <Content>
    <section name="FileID"/>
    <FileID>109F2AEA-6D9C-4127-963A-9C71D4155C5D</FileID>
       <File Path="C:\test.config">
          <Tag TagName="configuration"/>
       </File>
 </Content>
'@

$expression = "Content/FileID"
$navigator = $xml.PSBase.CreateNavigator()
$node = $navigator.Evaluate($expression)
$node | Select OuterXml # or any other properties

РЕДАКТИРОВАТЬ после вашего комментария:

$xml = [xml](Get-Content "c:\temp\test.xml")
$xml.SelectSingleNode("//FileID")  | ?{ $_.InnerText -eq "109F2AEA-6D9C-4127-963A-9C71D4155C5D" } | %{ $_.InnerText = "blah" }
$xml.Save("c:\temp\test.xml")
Другие вопросы по тегам