2012-02-14 3 views
0

나는 그런 Comp1.log, Comp2.log 같은 로그 파일 이름 등업데이트 XML 노드 값

COMP1 코드 수를 데

<Components> 
    <Component> 
    <Name>Comp1</Name> 
    <Baseline>Comp1_2.1.0.20.2824</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
    <Component> 
    <Name>Comp2</Name> 
    <Baseline>Comp2_2_7_2012.3171</Baseline> 
    <KLOC>0</KLOC> 
    <IsCount>True</IsCount> 
    </Component> 
</Components> 

을 다음과 같이 내가 XML을 데이해야 간다 구성 요소 이름 Comp1의 KLOC 태그.

다음은 가져 오기 코드 수를 찾는 로직입니다. 로그 파일에서 다음과 같이 코드 수를 사용할 수 있습니다.

총 라인 (버전 2) : 1084

나는 다음과 같은 논리를 사용하여 버전 번호를 제외하고 문자열을 종료합니다.

$Files=Get-ChildItem -Path $CCountFolder -Recurse 
    $Totallinesver2+= Get-ChildItem -Path $CCountFolder -Recurse | Foreach { Get-Content $_.FullName | Select-string -simplematch "Total Lines (version 2)" } 

     Foreach ($line in $Totallinesver2) { $Count+= ($line -replace "Total Lines \(version 2\)  : ","")} 
     $count 
Foreach ($file in $Files) { $file.Name } 

이제 각 구성 요소 KLOC 태그에 KLOC를 저장하려고했습니다.

답변

1

작은 XPath를 사용하면 text() 노드에 대한 핸들을 가져 와서 값을 설정할 수 있습니다.

업데이트 : 구문 분석 한 파일의 이름을 기반으로 Xpath 쿼리를 동적으로 만들려면 GetFileNameWithoutExtension 메서드를 사용할 수 있습니다. 이는 파일의 이름이 XML의 구성 요소 이름과 일치하는 한 작동합니다. 코드를 추가하여 foreach 루프 내의 $count 변수를 검색하십시오.

$doc = [xml] (Get-Content "C:\InputFile.xml") 
$compFiles = 'Comp1.log', 'Comp2.log' 

foreach ($file in $compFiles) { 

    # Get $count from $file here... 

    $compName = [IO.Path]::GetFileNameWithoutExtension($file) 
    $xpath = "//Component[Name='${compName}']/KLOC/text()" 
    $node = $doc.SelectSingleNode($xpath) 
    $node.Value = $count 
} 

$doc.Save("C:\Output.xml") 
+0

질문의 명확성을 더했습니다. 가능하다면 도와주세요 – Samselvaprabu

+0

@Samselvaprabu 추가 된 요구 사항에 따라 답변을 업데이트했습니다. –

+0

그것은 작동합니다. 좋은 친구. 나는 실수를했다. – Samselvaprabu