区分标记名称和属性“名称”XML PowerShell

时间:2012-06-01 06:54:03

标签: xml powershell xmlnode xml-attribute

我有一个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>

当我使用PowerShell中的以下代码行对每个节点进行递归搜索以识别名为“FileID”的节点时:

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

其中$ ConfigChildItem将以递归方式从XML中填充节点以进行搜索。 通过这个,我期待获得名为“FileID”的节点,如:

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

但它正在取出像:

这样的标签
<section name="FileID"/>

因为它们具有值为“FileID”的属性“name”。 如何只获取名称为“FileID”的标签,而不是那些属性名称为“name”的标签,以及这些属性的值为“FileID”?

1 个答案:

答案 0 :(得分: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")