2017-02-15 20 views
1

我已經以這種方式格式化XML數據: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 

我能想出的最好的是:

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 

其中給出這樣的結果:

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 

很清楚如何打印每波形一行,但不包括如何從每個WaveformData打印一行,如果我想從其父項中包含time屬性。這可以做到嗎?或者,我應該在周圍工作並做一些切片和粘貼以便在後端修復它?

+0

在這個問題上和測試數據所提出的命令行在這個問題上不要實際上一起工作。也許被忽略的'波浪'有錯? –

+0

...此刻,我擔心我生成的任何答案都不會對您的*實際*數據起作用。 –

+0

看來我粘貼了我用來生成上面輸出的代碼。我認爲唯一的區別是-m波被移除,但是直到明天才能夠檢查。真正的問題是如何花時間解析每組波形數據。 –

回答

3

搜索波形數據 - 因爲它是你想要的每一行 - 並且只是在樹中向上遍歷以找到你的時間元素。

$ 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 

另外,如果你知道每個波形將有整整兩個WaveformData孩子,你可以做到以下幾點:

$ 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'。 –