当我有这样的 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"]))
我使用untangle
或xmltodict
代替内置 XML 库,因为我发现它们更容易使用。当然,这可以用任何其他脚本语言来实现。