2017-02-15 17 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 

Это ясно, как печатать одна строка на Waveforms, но не как печатать одну строку на WaveformData, если я хочу включить атрибут time из своего родителя. Это можно сделать? В качестве альтернативы, следует ли мне работать и делать некоторые нарезки и вставки, чтобы потом исправить их на заднем конце?

+0

Предложенная командная строка в этом вопросе и тестовых данных в этом вопросе доном Фактически мы работаем вместе. Может быть, устранены «Волны»? –

+0

... В настоящий момент я волнуюсь, что любой ответ, который я сгенерировал, не будет работать против ваших * фактических * данных. –

+0

Кажется, я вставил спину от кода, который я использовал для генерации вывода выше. Я думаю, что единственное различие заключается в том, что волны -m удаляются, но не смогут проверить до завтра. Реальный вопрос заключается в том, как просто получить время для анализа с каждым набором данных формы волны. –

ответ

3

Поиск 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 

С другой стороны, если вы знаете что каждый осциллограмм будет иметь ровно два 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'. –