我有一个大型的复杂XML文件,其中包含如下所示的模式
<?xml version="1.0" encoding="UTF-8"?>
<records>
<record>
<field1>field1</field1>
<field2>field2</field2>
<field2>field2</field2>
<field3>field3</field3>
<field4>field4</field4>
<field4>field4</field4>
</record>
<record>
<field1>field1</field1>
<field1>field1</field1>
<field3>field3</field3>
<field4>field4</field4>
<field4>field4</field4>
</record>
</records>
我想使用xmlstarlet将其转换为以分号分隔的制表符,其中重复的字段以分号分隔,例如
field1\tfield2;field2\tfield3\tfield4;field4
field1;field1\t\tfield3\t\field4;field4
我可以通过将重复的字段用字符串处理例程折叠来做我需要的事情,然后再将文件提供给xmlstarlet,但这感觉很hack。在xmlstarlet中是否有一种优雅的方法可以完成所有操作?
xmlstarlet sel -t -m "/records/record" -m "*[starts-with(local-name(),field)]" -i "position()=1" -v "." --else -i "local-name() = local-name(preceding-sibling::*[1])" -v "concat(';',.)" --else -v "concat('\t',.)" -b -b -b -n input.xml
在伪代码中,它表示类似这样的内容
每个
/records/record
field
开头的每个元素的名称;Item
\tItem
b
的确意味着“中断”或if子句n
输出换行符field1\tfield2;field2\tfield3\tfield4;field4
field1;field1\tfield3\tfield4;field4