2016-10-07 8 views
0

XML要素を返すが、「titleId」を返し、最後の行から「開始」することが必要でXMLファイルの抽出PowerShellの:難易度以下

<JobList> 
    <Job id="Hotel" start="2016-10-06" /> 
    <Job id="Cleaning" start="2016-10-06" /> 
    <Job id="Floor" start="2016-10-06" /> 
    <Job id="Training" start="2016-10-06" /> 
    <Job id="Meeting" start="2016-10-06" /> 
    <Job id="CI" start="2016-10-06" /> 
<Job titleId="Kitchen Associate" id="Kitchen" start="2016-10-06" rank="18"> 

です。

私が次のコードを書くと、私はtitleIdを得ることができます。 "Kitchen Associate"に問題はありません。

gc "\\path\fil.xml" | Select-Xml -XPATH "//Job/@start" | select * -expandproperty node | Select titleID 

しかし、関連する開始日を返すようには思えません。開始日の7つをJobListからすべて返すためです。 titleIDも存在する場所からしか取得できないように、結果を限定する方法はありますか?

おかげ

答えて

1

あなたのコードの問題は、あなたが取ったアプローチは、あなたが正しいノードを取得し、その属性を選択する必要がある場合、異なるノードから属性を取得に向けて配向していることがあります。あなたは、同様のXPathでそれを達成することができます:

(gc "e:\1.txt" -Raw | Select-Xml -XPATH "//Job[@titleId]/@start").Node 

が、ここでは、これを行うのがよりPowerShellの方法です:

$xml = [xml] (gc e:\1.txt -Raw) 
$node = $xml.JobList.Job | Where-Object { $_.titleId -ne $null } 
$node.start 

あなたが最初titleId属性に基づいて正しいノードを選択し、あなたがアクセス権を持っていますすべての属性

titleIdを持つノードが1つ以上存在しない可能性があるので、$nodeがヌルではないこととノードがいくつあるかを確認する必要があります。

+0

値が異なる可能性があるため、where句ではなくselect句が必要です。 – JDGEEK

+0

私はこの方法でこれを達成しました。長らく残念ですが、私はPSの専門家でも開発者でもありません:gc "\\ path \ fil.xml" | Select-Xml -XPATH "// Job" | | -expandpropertyノードを選択|タイトルIDを選択、開始|ここで、{$ _。titleID -ne $ NULL} |実際には非常に複雑な解決策である-expandproperty titleID – JDGEEK

+0

を選択してください。 –

1

正しいXPathを使用してください。

Select-Xml -XPath '//Job[@titleId and @start]' | Select -expand titleId