使用xmlstarlet将包含重复字段和缺失字段的XML转换为制表符分隔的标签

问题描述 投票:0回答:1

我有一个大型的复杂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中是否有一种优雅的方法可以完成所有操作?

xml-parsing xmlstarlet delimited-text
1个回答
0
投票
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
  • © www.soinside.com 2019 - 2024. All rights reserved.