【发布时间】:2018-08-25 04:59:33
【问题描述】:
我想将复杂的 xml 转换为 csv。
<tests>
<test>
<name>AAA</name>
<language>BBB</language>
<Project>
<name>XXX</name>
<id>123</id>
</Project>
<fac>
<name>XXX</name>
<idt>
<number>99</number>
<idt>
<pers>YYY</pers>
</fac>
<fac>
<name>BBB</name>
<idt>
<number>70</number>
<idt>
<pers>MMM</pers>
</fac>
<fac>
<name>XXX</name>
<idt>
<number>40</number>
<idt>
<pers>XXX</pers>
</fac>
<date>2018</date>
</test>
<test>
<name>BBB</name>
<language>CCC</language>
<Project>
<name>AAA</name>
<id>12</id>
</Project>
<fac>
<name>YXX</name>
<idt>
<number>10</number>
<idt>
<pers>LLL</pers>
</fac>
<fac>
<name>BB</name>
<idt>
<number>7</number>
<idt>
<pers>MM</pers>
</fac>
<fac>
<name>XX</name>
<idt>
<number>40</number>
<idt>
<pers>XXX</pers>
</fac>
<date>2018</date>
</test>
<tests>
到目前为止我做了什么:
xmlstarlet \
sel -T -t -m /tests/test \
-v "concat(name,';'
,language,';'
,Project/name,';'
,Project/id,';'
,fac/name,';'
,fac/idt/number,';'
,fac/pers,';'
,date)"
-n test.xml > test.csv
一切正常,但我只能获取第一个节点中包含的数据。我想要这样的东西:
对于第一个
name;language;name;id;data contained in the first node"fac";date
name(same as first line);language(same as first line); etc..; data contained in the second "fac" node;date (same as first line)
etc... as much as there are face nodes
然后是第二个节点。
我不知道这是否可以使用 xmlstarlet 完成?
提前感谢您的帮助 RFlow
【问题讨论】:
-
您的示例输入不是有效的 XML,看起来您的所有
</idt>都变成了<idt>?修复此问题后,您的xmlstarlet电话对我来说效果很好。 -
谢谢,我的 xml 不是这种情况,但在这个例子中我忘记了。就算改了,也只能拿到第一个节点
-
真的吗?我得到两行输出:
AAA;BBB;XXX;123;XXX;99;YYY;2018,然后是BBB;CCC;AAA;12;YXX;10;LLL;2018。 -
如果我很清楚,我现在不知道,我想要的是第一个
节点: AAA;BBB;XXX;123;XXX;99;YYY;2018然后AAA;BBB;XXX;123;BBB;70;MMM;2018然后AAA;BBB;XXX;123;XXX;40;XXX;2018第二个也是一样 节点。 -
@DanielHaley 谢谢你的帮助。现在一切都很好:)
标签: xml csv xmlstarlet