2013-06-28 2 views
0

특성이 많이 있고 이름이 같은 여러 요소가있는 일부 XML 데이터가 있는데이를 CSV 파일로 병합하고 싶습니다. 이다XML PowerShell의 부모 및 자식 특성 및 요소

<?xml version="1.0" encoding="utf-8"?> 
<SEGMENTS> 
    <SEGMENT NAME="webcluster"> 
     <RESULTPAGE> 
      <RESULTSET FIRSTHIT="1" LASTHIT="100" HITS="100" TOTALHITS="100"> 
       <HIT NO="1" RANK="19000" SITEID="0" MOREHITS="100"> 
        <FIELD NAME="rank">19000</FIELD> 
        <FIELD NAME="id">1</FIELD> 
        <FIELD NAME="url">C:\website.com\folder1\file1.txt</FIELD> 
        <FIELD NAME="filename">file1.txt</FIELD> 
        <FIELD NAME="path">https://website.com/folder1/</FIELD> 
       </HIT> 
       <HIT NO="2" RANK="19000" SITEID="0" MOREHITS="100"> 
        <FIELD NAME="rank">19000</FIELD> 
        <FIELD NAME="id">2</FIELD> 
        <FIELD NAME="url">C:\website.com\folder1\file2.txt</FIELD> 
        <FIELD NAME="filename">file2.txt</FIELD> 
        <FIELD NAME="path">https://website.com/folder1/</FIELD> 
       </HIT> 
       <HIT NO="3" RANK="18999" SITEID="0" MOREHITS="100"> 
        <FIELD NAME="rank">18999</FIELD> 
        <FIELD NAME="id">3</FIELD> 
        <FIELD NAME="url">C:\website.com\folder5\file3.txt</FIELD> 
        <FIELD NAME="filename">file3.txt</FIELD> 
        <FIELD NAME="path">C:\website.com\folder\</FIELD> 
       </HIT> 
      </RESULTSET> 
     </RESULTPAGE> 
    </SEGMENT> 
</SEGMENTS> 

그리고 나는이

HIT filename path 
----- ---------- ------ 
1  file1.txt C:\website.com\folder1\ 
2  file2.txt C:\website.com\folder1\ 
3  file3.txt C:\website.com\folder5\ 

내 같은 코드를 생성하는 반복하기 위해 노력하고있어 : 데이터 XML은 다음과 같습니다

[xml]$xml=Get-Content .\xmlfile.xml 
$hits = $xml.segments.segment.resultpage.resultset.hit 
foreach($hit in $hits) 
{ 
    foreach($field in $hit.field) 
    { 
     if (field."NAME" -eq 'url') 
     { 
      write-output $hit.no $field."#VALUE" 
     } 
    } 
} 

그리고 나는 오류가 계속 발생합니다. ordinal location ($ hits [0] .field [4])으로 참조하여 다른 요소와 속성에 액세스 할 수 있지만 FIELD 값이 다른 순서로 표시 될 수있는 미래의 출력에 대해 보호하려고합니다.

누구나 내가 어떻게 이런 일을 할 수 있다고 제안 할 수 있습니까? select-XML을 사용해 보았을 때 더욱 귀찮은 일이 발견되었지만 좀 더 세련된 방법 일 수 있습니다.

답변

1

나는 이것을 좋아하지 않지만, 이렇게하는 것처럼 보입니다.

[xml]$xml=Get-Content .\xmlfile.xml 
$hits = $xml.segments.segment.resultpage.resultset.hit 
foreach($hit in $hits) 
{ 
    $result = new-object PSObject -Property @{ hit = $hit.no; filename = ""; path = ""} 

    foreach($field in $hit.field) 
    { 
     if ($field."NAME" -eq 'url') 
     { 
      $result.path = $field."#text" 
     } 
     if ($field."NAME" -eq 'filename') 
     { 
      $result.filename = $field."#text" 
     } 
    } 
    write-output $result 
} 

또는, 단지 모든 필드를 잡아하고 관련 선택 :

Select-Xml -Xml $xml -XPath '//HIT' | Foreach { 
    $num=$_.Node.NO 
    $filenameAttr = $_.Node.Field | where {$_.Name -eq 'filename'} 
    $pathAttr = $_.Node.Field | where {$_.Name -eq 'path'} 
    new-object psobject -Property ([ordered]@{HIT=$num; filename = $filenameAttr.InnerText; path = $pathAttr.InnerText}) 
} 
+0

고맙습니다! 누군가는 오프라인 제안 : '[XML] $ hitfile = GET-내용 fastxml.xml 'foreach는 ($ $의 hitfile.segments.segment.resultpage.resultset.hit에 명중) '{ '$ 행 = $ mjatable .NewRow() '$ row.Hit = $ hit.No '$ row.InternalID = $ hit.field | ? {$ _. 이름 -eq '내부 ID'} | foreach {$ _. 'text'} '$ row.URL = $ hit.field | ? {$ _. 이름 -eq 'url'} | foreach {$ _. 'text}} $ mjaTable.Rows.Add ($ row) '} '$ mjaTable | format-table -AutoSize – MJA

+0

NAME attrib = ("url"또는 "Internalid")로 FIELD 요소를 참조하고 WHERE-OBJECT 필터를 사용하지 않고 '#text'값을 검색 할 수 있다면 여전히 궁금합니다. 이 두 가지 해결책은 작업을 완료합니다 – MJA

+0

주석의 코드는 PITA이고 응답을 – user1578107

0

하면이 같은 것을보십시오. Select를 사용하면 특정 순서로 필드를 가져올 수 있습니다.

[xml]$xml=Get-Content .\xmlfile.xml 
$hits = $xml.segments.segment.resultpage.resultset.hit 
foreach($hit in $hits) 
{ 
    $r = @{hit = $hit.no; url = "N/A";filename="N/A"} 
    $hit.field | % { $r[$_."NAME"] = $_."#text" } 
    New-Object PSObject -Property $r | Select hit,url,filename 
} 
+0

키이스로 업데이트합니다. 위에서 코드를 시도합니다. [주문 됨] 유형을 찾을 수 없습니다. 타입이로드됩니다. 줄에 : 6 문자 : 45 + 새 개체 psobject - 속성 ([주문] <<<< @ {HIT = $ num; filename = $ filenameAttr.InnerText; path = $ pathAttr.InnerText}) + CategoryInfo : InvalidOperation : (ordered : String) [], RuntimeException + FullyQualifiedErrorId : TypeNotFound 몇 가지 수정을 시도해 보겠습니다. – MJA

+0

아, PowerShell V3의 새로운 기능입니다. 이를 제거 할 수는 있지만 생성 된 객체의 속성 순서는 무작위입니다. –

0

결합 방법 :

[xml]$xml=Get-Content .\xmlfile.xml 
$hits = $xml.segments.segment.resultpage.resultset.hit 
foreach($hit in $hits) 
{ 
    $result = new-object PSObject -Property @{ hit = $hit.no } 
    $hit.field | % { Add-Member -InputObject $result -MemberType NoteProperty -Name $_."NAME" -Value $_."#text"} 
    $result | select hit,url,filename | write-output 
} 
관련 문제