2012-06-01 40 views
1

我有一个XML输入如下图所示:微分标记名称和属性“名” XML的PowerShell

<?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") 
+0

感谢您的回答。这是有效的,但问题在于,“FileID”标签可以来自任何级别,这就是为什么我需要通过递归搜索来识别标签。 – RinoTom

+0

您可以使用“// FileID”作为xpath表达式来查找任何级别的所有FileID。 –

+0

但是,搜索是为了编辑输出节点的内容并保存xml文件,然后这种从XML输入单独提取内容的方式将是单调乏味的。有没有更好的方法来完成这件事? – RinoTom