2012-06-01 63 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