XML a JSON v příkazové řádce

xmllint a XMLStarlet pracují s XML, jq s JSON. yq může označovat více různých programů; před použitím příkazu ověř implementaci a verzi.

Autor: Aktualizováno

xmllint: syntaxe, XSD a formátování

xmllint --nonet --noout data.xml
xmllint --nonet --noout --schema data.xsd data.xml
xmllint --nonet --format data.xml
xmllint --nonet --xpath "count(/objednavka/polozka)" data.xml

První příkaz kontroluje dobře formovaný dokument, druhý schéma. --nonet u starších libxml2 omezuje síť, nikoli obecně přístup k místním souborům; v libxml2 2.15 a novějších už podle manuálu nemá účinek. Nepřidávej --noent ani --xinclude pro nedůvěryhodné XML. Bezpečnost a limity verze libxml2 ověř v manuálu.

XMLStarlet: výběr hodnot s prefixy

xmlstarlet sel -N o=urn:objednavky -t -m /o:objednavka/o:polozka -v @nazev -n data.xml

Prefix o v dotazu je svázán s URI a nemusí odpovídat původnímu prefixu. Výstup s -v je text; pokud potřebuješ XML, vyber odpovídající kopírování uzlu. XMLStarlet používá pro výběry XPath 1.0.

jq: výběr a transformace JSON

jq . data.json
jq -r '.polozky[] | .nazev' data.json
jq '[.polozky[] | select(.cena >= 100)]' data.json
jq -e 'type == "object" and has("polozky")' data.json

-r vypíše řetězce bez JSON uvozovek, takže výstup nemusí být JSON. -e vyhodnocuje návratový kód podle výsledku; ve skriptu kontroluj také selhání parseru. jq není plný JSON Schema validátor.

yq a xq: ověř správný program

Mike Farah yq je samostatný program s vlastním jazykem, zatímco kislyuk/yq je wrapper jq a poskytuje také xq pro XML. Jejich přepínače a datové modely nejsou stejné.

yq --version
# Mike Farah yq: převod YAML do JSON
yq -o=json '.' data.yaml
# kislyuk/yq: XML do objektového modelu a výběr jq
xq '.objednavka' data.xml

Převod XML na JSON může změnit atributy, opakované elementy, čísla i smíšený obsah. Vyzkoušej způsob převodu na typických vstupních datech. Příjemce musí používat stejné názvy klíčů a stejně vykládat atributy i seznamy.

Bezpečný provoz ve skriptu

  • Cituj názvy souborů a neposílej cizí text přes eval.
  • Před zpracováním omez velikost, síť a oprávnění procesu.
  • Kontroluj návratový kód každého kroku.
  • Výstup ukládej do jiného souboru a původní nahraď až po úspěšném ověření.

Dokumentaci najdeš v manuálu xmllint, XMLStarlet a jq.