xquery4 1.8.0

There is a newer version of this package available.
See the version list below for details.
dotnet tool install --global xquery4 --version 1.8.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local xquery4 --version 1.8.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=xquery4&version=1.8.0
                    
nuke :add-package xquery4 --version 1.8.0
                    

xquery

Command-line XQuery 3.1/4.0 processor for .NET. Query XML documents from the terminal using the PhoenixmlDb XQuery engine.

Installation

dotnet tool install -g xquery4

Usage

# Query an XML file
xquery '//book/title' library.xml

# Count elements
xquery 'count(//item)' catalog.xml

# Read from a query file
xquery -f transform.xq input.xml

# Query a directory of XML files
xquery 'collection()//product[price > 50]' ./data/

# JSON output
xquery -o json 'map { "count": count(//item) }' data.xml

# Read from stdin
cat data.xml | xquery '//item/@name'

# Show execution plan
xquery --plan 'for $x in 1 to 10 return $x * $x'

# Show timing breakdown
xquery --timing '//item' large-catalog.xml

Features

  • XQuery 3.1/4.0 — FLWOR, maps/arrays, higher-order functions, string constructors
  • Multiple output methods — adaptive, XML, text, JSON
  • Context item — input XML is available as . (standard XQuery)
  • Multiple sources — files, directories, URLs, stdin
  • Full prolog support — namespaces, variable/function declarations, serialization options
  • Execution plans — inspect how queries are compiled and optimized
  • Timing — built-in performance profiling

Documentation

Full documentation at phoenixml.dev

License

Apache-2.0

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
2.8.0 67 10/9/2026
2.7.0 66 10/7/2026
2.6.0 88 10/6/2026
2.5.1 88 10/1/2026
2.4.1 90 9/28/2026
2.4.0 71 9/28/2026
2.2.0 421 9/25/2026
2.1.0 79 9/17/2026
2.0.0 83 9/15/2026
1.8.0 88 9/14/2026
1.7.0 85 9/11/2026
1.6.15 84 9/9/2026
1.6.14 98 9/7/2026
1.6.13 85 9/4/2026
1.6.12 85 9/1/2026
1.6.11 91 8/29/2026
1.6.10 90 8/29/2026
1.6.9 88 8/27/2026
1.6.8 87 8/26/2026
1.6.7 95 8/24/2026
Loading failed

Minor rather than patch: built-in functions now enforce their declared argument cardinality, which
is observable behaviour for any query that was relying on the lenient answer.

Takes PhoenixmlDb.Core 1.7.0.

### Behaviour change — read this before upgrading

**Built-in functions now apply argument cardinality, and their signatures match F&O 3.1.**
Previously they did not, so a call passing an empty or multi-item argument where the spec requires
exactly one returned a value instead of raising:

| call | before | after |
|---|---|---|
| `substring('abc', ())` | `""` | `XPTY0004` |
| `substring('abc', (1,2))` | `"abc"` | `XPTY0004` |
| `round-half-to-even(1.5, ())` | `2` | `XPTY0004` |

This applies to **every** built-in, not only the string functions above — the examples are
illustrative, not exhaustive. User-defined functions already raised `XPTY0004`, so this makes the
built-ins consistent with them. A query relying on the lenient behaviour will now fail where it
previously produced a value.

Enabling the check required correcting our own declarations first: **86 signatures** — 38
individually declared parameters plus all 48 `xs:` constructors through one shared base — were
stricter than F&O 3.1 demands.

### Fixed

- **Every `xs:integer` parsed from text was a `BigInteger`.** The source of a defect family, and
 the cause of wrong results from `sum()` over integers read from a document.
- **`map:put` / `map:remove` / `map:replace` copied the whole map** — O(n) per update and O(n²)
 per loop. Now a HAMT.
- **Map keys the comparer called equal could hash apart**, so a numeric lookup could miss and then
 degrade to O(n).
- **A caller's timeout could not stop recursion, callbacks, or a slow `every`.** Cancellation is
 now polled in the hot loops.
- **`contains text` threw at compile time, searched only one item, and matched `{expr}` against
 everything.**
- **`contains text` treated `any` and `all` as word-level**; each search string is a phrase.
- **`dbxml:` and `ft:` functions were uncallable.** Adds `CompilationOptions.StaticNamespaces` so a
 host can bind its own prefixes.
- **Host namespace bindings never reached run-time prefix resolution**, so `xs:QName('h:x')`, `cast
 as xs:QName` and computed element names did not see them.
- **An index lookup with no resolver answered "no matches" instead of failing** — so indexing on
 returned 0 where indexing off returned 1.

### Build

- **Development mode.** `PHOENIXML_DEV=1`, a workspace marker file, or `-p:PhoenixmlDev=true`
 switches `PhoenixmlDb.*` package references to project references against the sibling checkouts.
 `dotnet pack` refuses to run in dev mode and CI errors if it is ever on, so it cannot reach a
 release.