在 Bash 中将 XML 打印为表格

在 Bash 中将 XML 打印为表格

当我有这样的 XML 文件时:

<guests>
    <guest>
        <name>Adam</name>
        <music>Silence</music>
        <dish>Vegetables</dish>
        <beverage>Water</beverage>
    </guest>
    <guest>
        <name>Brutus</name>
        <music>Verdi</music>
        <dish>Meat</dish>
        <beverage>Mulsum</beverage>
    </guest>
</guests>

有没有一种优雅的 bash-y 方法可以将其格式化为表格?我想象它是这样的:

cat myPartyGuests.xml | xmlToTable --lines "/guests/guest" --columns "name, beverage, dish"

结果是这样的:

name   beverage dish
Adam   Water    Vegetables
Brutus Mulsum   Meat

我已经知道如果我可以将 XML 变成如下形式:

name;beverage;dish
Adam;Water;Vegetables
Brutus;Mulsum;Meat

...我可以用来column -s\; -t准确获取我想要的输出,因此只缺少“XML 到 CSV”步骤。

答案1

一种解决方案是使用 XSL 转换使用 XSL 样式表

或者编写一个简单的 Python 脚本:

#!/usr/bin/env python3

import untangle, sys

data = untangle.parse(sys.stdin.read())

print(" ".join(["name", "beverage", "dish"]))
for guest in data.guests.guest:
    print(" ".join([guest.name.cdata, guest.beverage.cdata, guest.dish.cdata]))

untangle使用安装pip3 install --user untangle,使脚本可执行,然后运行:

$ ./test.py < myPartyGuests.xml
Adam Water Vegetables
Brutus Mulsum Meat

或者使用xmltodict

#!/usr/bin/env python3

import xmltodict, sys

data = xmltodict.parse(sys.stdin.read())

fields = ["name", "beverage", "dish"]

print(" ".join(fields))
print("\n".join(" ".join(guest[f] for f in fields) for guest in data["guests"]["guest"]))

我使用untanglexmltodict代替内置 XML 库,因为我发现它们更容易使用。当然,这可以用任何其他脚本语言来实现。

相关内容