使用xmlstarlet进行XPath查询

时间:2018-02-07 13:06:39

标签: xml xpath xmlstarlet

我有类似于这个的XML:

<orders>
        <orderCompleteRequestType>
                <Head>
                        <Aufnr>11111</Aufnr>
                </Head>
                <Register>
                        <Id>180</Id>
                        <value1>11</value1>
                        <value2>22</value2>
                </Register>
                <Register>
                        <Id>181</Id>
                        <value1>3</value1>
                        <value2>43</value2>
                </Register>
                <Register>
                        <Id>160</Id>
                        <value1>5</value1>
                        <value2>25</value2>
                </Register>
        </orderCompleteRequestType>
        <orderCompleteRequestType>
                <Head>
                        <Aufnr>22222</Aufnr>
                </Head>
                <Register>
                        <Id>280</Id>
                        <value1>1</value1>
                        <value2>12</value2>
                </Register>
                <Register>
                        <Id>160</Id>
                        <value1>12</value1>
                        <value2>7</value2>
                </Register>
                <Register>
                        <Id>281</Id>
                        <value1>94</value1>
                        <value2>22</value2>
                </Register>
        </orderCompleteRequestType>
</orders>

我想以CSV格式选择每个&#34; orderCompleteRequestType&#34;中的一些值。结构:

  • 头/ Aufrn
  • 注册/编号
  • 注册/ VALUE1
  • 注册/ VALUE2

使用以下命令行时:

xmlstarlet sel -T -t -m "/orders/orderCompleteRequestType" -v "Head/Aufnr" -o ";" -v "Register/Id" -o ";" -v "Register/value1" -o ";" -v "Register/value2" -n -n test.xml

我明白了:

11111;180
181
160;11
3
5;22
43
25

22222;280
160
281;1
12
94;12
7
22

所以,首先是寄存器/ Id节点的所有值,然后是所有寄存器/值1,最后是所有寄存器/值2,但我希望这样:

11111;180;11;22
11111;181;3;43
11111;160;5;25

22222;280;1;12
22222;160;12;7
22222;281;94;22

任何人都可以帮助我,因为我的大脑拒绝做工作......

1 个答案:

答案 0 :(得分:1)

不要匹配orderCompleteRequestType,而是考虑匹配Register而不是......

xmlstarlet sel -T -t -m "/orders/orderCompleteRequestType/Register" -v "concat(../Head/Aufnr,';',Id,';',value1,';',value2)" -n test.xml

...输出

11111;180;11;22
11111;181;3;43
11111;160;5;25
22222;280;1;12
22222;160;12;7
22222;281;94;22

每个orderCompleteRequestType之间没有额外的换行符,但也许这不是什么大问题?如果是,可能更容易编写XSLT并使用xmlstarlet调用它。