2017-01-31 9 views
3

要素ノードから属性を抽出したXMLファイルを処理しようとしています。私はヘッダー値が存在する場合はそれを抽出し、その "グループ"のすべての型属性を返しますが、存在する場合にのみそれを返します。私はそれをどうやって行うのかはかなり分かりません。ヘッダー値を取得することはできますが、ヘッダー値を持つ「グループ」との関連付けだけではうまくいかないことがあります。私はグループが間違った用語であると確信しています。親ノードからヘッダを取得したいのとほぼ同じですが、親には格納されません。XMLでノードを処理しますが、前の要素からノード属性を保持します。

私が説明しようとしたことをうまく実証するために、サンプル出力を含めました。

$xml = [xml]@" 
<document document="test"> 
    <elements> 
    <element type="header">Header1</element> 
    <element type="link" title="Title1" /> 
    <element type="link" title="Title2" /> 
    <element type="link" title="Title3" /> 
    </elements> 
    <elements> 
    <element type="link" title="Title200" /> 
    </elements> 
    <elements> 
    <element type="header">Header2</element> 
    <element type="link" title="Title300" /> 
    <element type="link" title="Title301" /> 
    </elements> 
</document> 
"@ 

$objs = @() 
$nodes = $xml.SelectNodes("//*[@type]") 
foreach ($node in $nodes) { 
    #$node.ParentNode.ToString() 
    $type = $node.Attributes['type'].value 
    if ($type -eq "header") {$header = $node.InnerText} 
    $title = $node.Attributes['title'].value 
    $obj = New-Object PSObject -Prop @{TYPE=$type;TITLE=$title;HEADER=$header} 
    $objs += $obj 
} 
$header = "" 
$objs 

私は現在取得しています出力:私は希望

TITLE HEADER TYPE 
----- ------ ---- 
     Header1 header 
Title1 Header1 link 
Title2 Header1 link 
Title3 Header1 link 
Title200 Header1 link 
     Header2 header 
Title300 Header2 link 
Title301 Header2 link

出力(ないヘッダがTitle200のために示されていない):

TITLE HEADER TYPE 
----- ------ ---- 
     Header1 header 
Title1 Header1 link 
Title2 Header1 link 
Title3 Header1 link 
Title200   link 
     Header2 header 
Title300 Header2 link 
Title301 Header2 link

答えて

2

をあなたはbeginnigで$header変数を初期化されていませんforeachのそれぞれが通過すると、以前の値が内部に保持されます。これを試してみてください:

$objs = @() 
$nodes = $xml.SelectNodes("//*[@type]") 
foreach ($node in $nodes) { 
    #$node.ParentNode.ToString() 
    $header = "" 
    $type = $node.Attributes['type'].value 
    if ($type -eq "header") {$header = $node.InnerText} 
    $title = $node.Attributes['title'].value 
    $obj = New-Object PSObject -Prop @{TYPE=$type;TITLE=$title;HEADER=$header} 
    $objs += $obj 
} 
$header = "" 
$objs 
+0

提案をありがとうしかし、(用語は適切ではない場合は、再度、謝罪)ヘッダーテキストが同じ「グループ」のものに対して、リストに表示されていないので、これは を私が探していた出力を与えるものではありませんTITLEヘッダタイプ ----- ------ ---- ヘッダ1ヘッダタイトル1リンク タイトル2リンク TITLE3リンク Title200リンク ヘッダ2のヘッダ Title300リンク Title301リンク – Orielton

0

私は最終的にこれを働いてきた - 私は、親ノードを参照して、どこ属性タイプは、=「ヘッダ」要素を取得するためにSELECTSINGLENODEを使用して「グループ」のヘッダを取得することができます。

$xml = [xml]@" 
<document document="test"> 
    <elements> 
    <element type="header">Header1</element> 
    <element type="link" title="Title1" /> 
    <element type="link" title="Title2" /> 
    <element type="link" title="Title3" /> 
    </elements> 
    <elements> 
    <element type="link" title="Title200" /> 
    </elements> 
    <elements> 
    <element type="header">Header2</element> 
    <element type="link" title="Title300" /> 
    <element type="link" title="Title301" /> 
    </elements> 
</document> 
"@ 

cls 

$objs = @() 
$nodes = $xml.SelectNodes("//*[@type]") 
foreach ($node in $nodes) { 
    $header = "" 
    $type = $node.Attributes['type'].value 
    #using the ParentNode, retrieve the element where the attribute type='header' 
    #and then get the InnerText to get the actual value 
    $header = $node.ParentNode.SelectSingleNode("element[@type='header']").InnerText 
    $title = $node.Attributes['title'].value 
    $obj = New-Object PSObject -Prop @{TYPE=$type;TITLE=$title;HEADER=$header} 
    if ($type -ne "header") { 
    $objs += $obj 
    } 
} 
$header = "" 
$objs 

これは私が探している出力です。もっと効率的な方法があるかもしれませんが、うまくいけばうまくいけば誰かを助けるでしょう。

TITLE HEADER TYPE 
----- ------ ---- 
Title1 Header1 link 
Title2 Header1 link 
Title3 Header1 link 
Title200   link 
Title300 Header2 link 
Title301 Header2 link 
関連する問題