2017-02-15 9 views
1

からデータムを使用している間、私はこの方法でフォーマットされたXMLデータを持っている、項目ごとに1行を印刷:XMLStarlet:親要素

<XML> 
    <Waveforms Time="01/01/2009 3:00:02 AM"> 
     <WaveformData Channel="I">1, 2, 3, 4, 5, 6 </WaveformData> 
     <WaveformData Channel="II">9, 8, 7, 6, 5, 4 </WaveformData> 
    </Waveforms> 
    <Waveforms Time="01/01/2009 3:00:04 AM"> 
     <WaveformData Channel="I">1, 2, 3, 4, 5, 6 </WaveformData> 
     <WaveformData Channel="II">9, 8, 7, 6, 5, 4 </WaveformData> 
    </Waveforms> 
</XML> 

私はカンマ区切り(テキストファイルにこのデータを解析するためにxmlstarletを使用しようとしています)。所望の出力は次のようになります。

Time Attribute, Channel Attribute, Data 
01/01/2009 3:00:02 AM, I, 1, 2, 3, 4, 5, 6 
01/01/2009 3:00:02 AM, II, 9, 8, 7, 6, 5, 4 
01/01/2009 3:00:02 AM, I, 1, 2, 3, 4, 5, 6 
01/01/2009 3:00:02 AM, II, 9, 8, 7, 6, 5, 4 

を私が思い付くことができる最高は次のとおりです。

01/01/2009 3:00:02 AM, I, 1, 2, 3, 4, 5, 6, II, 9, 8, 7, 6, 5, 4 
01/01/2009 3:00:04 AM, I, 1, 2, 3, 4, 5, 6, II, 9, 8, 7, 6, 5, 4 

それは印刷する方法は明らかです。このような結果を与える

xmlstarlet sel -T -t -m //XML/Waveforms -v @Time -o "," -m Waves -v WaveformData/@Channel -o "," -v WaveformData -o "," -b -n testwave2.xml > testwave.txt 

1つのWaveformsに対して1行を出力しますが、その親からtime属性を含める場合は、WaveformDataごとに1行を出力する方法ではありません。これはできますか?あるいは、後でバックエンドで修正するためにいくつかスライスして貼り付けますか?

+0

この質問で提案されているコマンドラインと、この質問ドンのテストデータ実際に一緒に働くことはありません。おそらく、逃げられた '波(Waves)'には誤りがありますか? –

+0

...現時点では、私が生成した回答はあなたの*実際のデータに対してはうまくいかないと心配しています。 –

+0

上記の出力を生成するために使用したコードをスピンオフしたようです。唯一の違いは-m波が削除されていることですが、明日まで確認することはできません。実際の質問は、波形データのすべてのセットを解析する時間を取得する方法です。 –

答えて

3

WaveformDataを検索します。各データは1行に1つずつ入力します。ツリーの上をトラバースするだけで、時間要素を見つけることができます。あなたは、各波形は正確に2 WaveformDataの子供を持つことになりますを知って場合、あなたは次のことを行うことができ

$ xmlstarlet sel -T -t -m /XML/Waveforms/WaveformData \ 
    -v ../@Time -o "," \ 
    -v @Channel -o "," \ 
    -v . -n <in.xml 
01/01/2009 3:00:02 AM,I,1, 2, 3, 4, 5, 6 
01/01/2009 3:00:02 AM,II,9, 8, 7, 6, 5, 4 
01/01/2009 3:00:04 AM,I,1, 2, 3, 4, 5, 6 
01/01/2009 3:00:04 AM,II,9, 8, 7, 6, 5, 4 

代わりに、:

$ xmlstarlet sel -T -t -m /XML/Waveforms \ 
    -v ./@Time -o ",I," -v './WaveformData[@Channel="I"]' -n \ 
    -v ./@Time -o ",II," -v './WaveformData[@Channel="II"]' -n <in.xml 
01/01/2009 3:00:02 AM,I,1, 2, 3, 4, 5, 6 
01/01/2009 3:00:02 AM,II,9, 8, 7, 6, 5, 4 
01/01/2009 3:00:04 AM,I,1, 2, 3, 4, 5, 6 
01/01/2009 3:00:04 AM,II,9, 8, 7, 6, 5, 4 
+0

ありがとう - 私は明日これをテストします! –

+0

の目的は何ですか?三番目の-vの後? –

+0

@TomFogarty - これは現在のコンテキストです。この場合は「WaveformData」となります。 –