XMLStarlet:使用父元素的数据时,每个项目打印一行

XMLStarlet:使用父元素的数据时,每个项目打印一行,xml,bash,parsing,xpath,xmlstarlet,Xml,Bash,Parsing,Xpath,Xmlstarlet,我将XML数据格式化为以下格式: <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> </Wa

我将XML数据格式化为以下格式:

<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 sel -T -t -m //XML/Waveforms -v @Time -o "," -m Waves -v WaveformData/@Channel -o "," -v WaveformData -o "," -b -n testwave2.xml > testwave.txt
结果如下:

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

很清楚如何在每个波形中打印一行,但如果要包含其父级的时间属性,则不清楚如何在每个波形中打印一行。这能做到吗?或者,我是否应该做一些工作,然后进行切片和粘贴,将其固定在后端?

搜索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/WaveformData\
-v../@Time-o“\
-v@通道-o“\

-五,-n要对Charles Duffy的答案稍作改动,可以使用
concat()
函数将其简化一点,并使用初始模板提供CSV标题:

$ xmlstarlet sel \
    -t -o 'Time Attribute, Channel Attribute, Data' -n \
    -t -m '//Waveforms/WaveformData' \
       -v 'concat(../@Time, ", ", @Channel, ", ", text())' -n \
  waveforms.xml
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:04 AM, I, 1, 2, 3, 4, 5, 6
01/01/2009 3:00:04 AM, II, 9, 8, 7, 6, 5, 4

这个问题中建议的命令行和这个问题中的测试数据实际上并不协同工作。也许被省略的
Waves
有问题?…目前,我担心我生成的任何答案都不会与您的实际数据相矛盾。似乎我粘贴了我用于生成上述输出的代码的衍生产品。我认为唯一的区别是-m波被移除了,但要到明天才能检查。真正的问题只是如何获得时间来解析每一组波形数据。实际数据的格式如上所述,xmlstarlet代码只是有点偏离。旁白:
//XML
要求解析器在文档中搜索
XML
元素。除非您知道需要这样做,否则请使用
/XML
。谢谢-我明天会测试这个!这次会议的目的是什么。在第三个-v???@TomFogarty-之后是当前上下文;在本例中
waveormdata
。谢谢Charles-很好的解决方案。谢谢daniel的回答
$ xmlstarlet sel \
    -t -o 'Time Attribute, Channel Attribute, Data' -n \
    -t -m '//Waveforms/WaveformData' \
       -v 'concat(../@Time, ", ", @Channel, ", ", text())' -n \
  waveforms.xml
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:04 AM, I, 1, 2, 3, 4, 5, 6
01/01/2009 3:00:04 AM, II, 9, 8, 7, 6, 5, 4