2012-06-01 2 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의 코드 행 다음에 : $ ConfigChildItem는 재귀에서 XML의 노드로 채워지고

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

을 검색하세요. 이로써 나는 이름이 "FileID에"로 노드를 얻기 위해 기다리고 있었다 같은 :

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

그러나이 같은 태그를지고 다음에 속성 "이름"을 가지고있는 그 이후

<section name="FileID"/> 

값 "FileID". 이름이 "FileID"이고 속성 이름이 "name"이고 속성의 값이 "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