Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

There is XPath 3.1: https://www.w3.org/TR/xpath-31/#id-lookup

It is more verbose, like you get the size of something with array:size or map:size functions, so it is more readable

I am implementing it in Xidel 0.9.9+: http://www.videlibri.de/xidel.html



XPath is really useful and `xmlstarlet` is/was jq before jq existed. These days it's relatively rare to get data in XML instead of JSON, though.


This is about JSON

xmlstarlet supports XPath 1, but the W3C did not stop there. They made XPath 2 featuring variables, lists and regular expressions, XPath 3 featuring higher order function, and finally XPath 3.1 featuring JSON support.

For example,

     echo '[{"a": 1}, {"a": 2, "b": 3}, {"c": 4}]' | xidel - -e '?*?a!(. * 100)'
will print 100 and 200.

Or the same with a verbose syntax:

    echo '[{"a": 1}, {"a": 2, "b": 3}, {"c": 4}]' | xidel - -e 'for $obj in array:flatten(.) return map:get($obj, "a")  * 100'


That's news to me. Very cool actually. It's not far from jq on speed, either. Looks like you are the maintainer of this tool, so thanks!

  ~/xidel % time ./xidel - -e '?SitusAddress!(.)' < ~/parcels | wc
  **** Processing: stdin:/// ****
    29066  149317  903704
  ./xidel - -e '?SitusAddress!(.)' < ~/parcels  2.55s user 0.18s system 99% cpu 2.733 total
  wc  0.01s user 0.00s system 0% cpu 2.733 total
  ~/xidel % time jq -r '.SitusAddress' < ~/parcels | wc
    29066  149317  903704
  jq -r '.SitusAddress' < ~/parcels  0.95s user 0.00s system 99% cpu 0.958 total
  wc  0.00s user 0.01s system 1% cpu 0.957 total




Consider applying for YC's Winter 2026 batch! Applications are open till Nov 10

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: