2010-02-24 6 views
4

지정된 디렉토리에서 여러 XML 파일 목록을 가져올 수 있으며 각 파일에 대해 powershell을 사용하여 두 번째 루트 노드 아래에 요소를 추가 할 수 있습니까?powershell을 사용하여 여러 XML 파일 편집

예 :

<People> 
    <Names> 
     <FirstName>someFirstName</FirstName> 
    </Names> 
    <Names> 
     <FirstName>myFirstName</FirstName> 
     <Address>SomeAddress</Address> 
    </Names> 
</People> 

이 될 것입니다 : 는 내가 처음 <Names> 요소 내에 <LastName>SomeName</LastName>를 추가 할

<People> 
    <Names> 
     <LastName>SomeName</LastName> 
     <FirstName>someFirstName</FirstName> 
    </Names> 
    <Names> 
     <FirstName>myFirstName</FirstName> 
     <Address>SomeAddress</Address> 
    </Names> 
</People> 
+0

당신이 사용할 수있는 유일한 도구를 PowerShell을된다? – ghostdog74

+0

아니, 내가 사용할 수있는 유일한 도구가 아닙니다. 그냥 사용하는 것이 가장 쉽다고 생각했습니다. 다른 것을 권할 수 있습니까? – Draco

답변

6
당신은 CreateElementAppendChild 방법을 사용하여 그것을 할 수

Get-ChildItem c:\temp\ *.xml | 
    % { 
     $xml  = [xml](Get-Content $_.fullname) 
     $lastName = $xml.CreateElement('LastName') 
     $lastName.PsBase.InnerText = 'SomeName' 
     $null  = $xml.People.Names[0].AppendChild($lastName) 
     $xml.Save($_.FullName) 
    } 

I 당신이 PowerShell을 V2를 실행 N의 경우, 당신은 재산 PsBase를 사용할 필요가 없습니다 :

 $lastName.InnerText = 'SomeName' 

이 확실히 다른 방법을하지만이 일이 매우 간단합니다. 노드가 XML에 깊은 것이라고 경우


, 당신은 다음과 같이 XPath는을 사용 (모두 처음 Names 노드 찾기) 있습니다

$node = (Select-Xml -Xml $x -XPath '//Names[1]').Node 
$node = (Select-Xml -Xml $x -XPath '//Names[position()=1]').Node 
+0

Erm,이 답변에서 정규 표현식을 언급하는 해당 줄을 제거해야합니다. 우리는 XML을 처리 할 때 옵션이 아닌 SO보다 많은 길을 택했습니다. – Joey

+0

완료. 당신과 동의하지만, 일부 사용자에게는 이것이 옵션 일 수 있습니다. 나는 처음에 ''을 ' SomeName'으로 바꾼 다음 xml로 다시 포맷 할 수 있습니다. * 해킹 * – stej

+0

스크립트를 실행할 때이 오류가 발생합니다 : "이 개체에서 'InnerText'속성을 찾을 수 없으므로 존재하고 설정 가능한지 확인하십시오." 내 Powershell 버전 일 수 있습니까? – Draco

관련 문제